{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 简介：手动特征工程 part 1\n",
    "\n",
    "如果你是初次参与这个竞赛，我强烈建议你先阅读这个文档https://www.kaggle.com/willkoehrsen/start-here-a-gentle-introduction/\n",
    "\n",
    "在这份文档中，我们首先会研究如何通过手工的方式，处理捷信公司贷款违约风险问题的相关特征。在更早之前的一篇文章中，我们仅仅使用了贷款申请数据来建模。我们利用该数据所建立的最佳模型在排行榜上的分数大约是0.74。为了提高这个分数，我们需要从其他数据中引入更多的信息，包括bureau和bureau_balance数据。数据的定义如下：\n",
    "bureau:捷信公司(Home Credit，下同)所掌握的客户从其他金融机构中贷款的历史信息。其中每一行代表一条历史贷款信息\n",
    "bureau_balance:历史贷款的月度信息。其中每一行代表一条月度信息\n",
    "\n",
    "手动特征工程是一个很无聊的过程（这就是我们为什么需要使用自动化的特征处理工具来处理我们的数据），而且该过程经常需要依靠该领域的专家知识来辅助处理。由于我对贷款行业和客户违约原因知之甚少，所以我的关注点集中在如何收集尽量多的数据来训练模型，原因在于模型会代替我们来评估哪些数据比较重要。简而言之，我们的方法就是获得尽量多的数据提供给模型使用！接着我们可以利用特征的重要性或是PCA降维等方法来进行特征约减\n",
    "\n",
    "进行手动特征工程的过程需要大量Pandas代码，一点点耐心和许多操作数据的实践。尽管自动化的特性工程工具已经十分遍历，但是特性工程仍然需要使用大量数据清洗重组(data wrangle)一段时间才能完成"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "#使用 pandas 和 numpy 进行数据处理\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "#使用 matplotlib 和 seaborn 进行绘制\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "#禁止 pandas 的编译警告\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "plt.style.use('fivethirtyeight')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 案例：计算客户历史贷款总数\n",
    "\n",
    "为了解释常见的手工特征工程流程，我们首先计算一个客户在其他金融机构的历史贷款信息总和，这一过程会用到许多我们接下去会频繁使用到的Pandas操作：\n",
    "\n",
    "* groupby: 按列对数据进行分组。在这个案例中我们根据具有唯一性的SK_ID_CURR列进行分组【按列进行分组？不是按行吗？】\n",
    "* agg: 对分组后的数据进行计算，例如列均值。我们可以直接使用方程(grouped_df.mean())或者将agg方程与转换后的列表一起使用(grouped_df.agg([mean, max, min, sum]))\n",
    "* merge: 将聚合后的数据与对应的客户匹配。我们需要将原始训练数据与计算后的SK_ID_CURR列数据结合在一起，如果SK_ID_CURR列没有对应的用户数据，则置为NaN。\n",
    "\n",
    "我们还经常使用（重命名）函数来将指定的列(columns)重命名为字典(dictionary)，这有利于对新创建的特征保持观察\n",
    "\n",
    "这看起来有点复杂，所以最终需要构造一个函数来代替我们执行这个过程。但首先，我们需要了解如何手工实现这个过程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th>CREDIT_ACTIVE</th>\n",
       "      <th>CREDIT_CURRENCY</th>\n",
       "      <th>DAYS_CREDIT</th>\n",
       "      <th>CREDIT_DAY_OVERDUE</th>\n",
       "      <th>DAYS_CREDIT_ENDDATE</th>\n",
       "      <th>DAYS_ENDDATE_FACT</th>\n",
       "      <th>AMT_CREDIT_MAX_OVERDUE</th>\n",
       "      <th>CNT_CREDIT_PROLONG</th>\n",
       "      <th>AMT_CREDIT_SUM</th>\n",
       "      <th>AMT_CREDIT_SUM_DEBT</th>\n",
       "      <th>AMT_CREDIT_SUM_LIMIT</th>\n",
       "      <th>AMT_CREDIT_SUM_OVERDUE</th>\n",
       "      <th>CREDIT_TYPE</th>\n",
       "      <th>DAYS_CREDIT_UPDATE</th>\n",
       "      <th>AMT_ANNUITY</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>215354</td>\n",
       "      <td>5714462</td>\n",
       "      <td>Closed</td>\n",
       "      <td>currency 1</td>\n",
       "      <td>-497</td>\n",
       "      <td>0</td>\n",
       "      <td>-153.0</td>\n",
       "      <td>-153.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>91323.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Consumer credit</td>\n",
       "      <td>-131</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>215354</td>\n",
       "      <td>5714463</td>\n",
       "      <td>Active</td>\n",
       "      <td>currency 1</td>\n",
       "      <td>-208</td>\n",
       "      <td>0</td>\n",
       "      <td>1075.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>225000.0</td>\n",
       "      <td>171342.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Credit card</td>\n",
       "      <td>-20</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>215354</td>\n",
       "      <td>5714464</td>\n",
       "      <td>Active</td>\n",
       "      <td>currency 1</td>\n",
       "      <td>-203</td>\n",
       "      <td>0</td>\n",
       "      <td>528.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>464323.5</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Consumer credit</td>\n",
       "      <td>-16</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>215354</td>\n",
       "      <td>5714465</td>\n",
       "      <td>Active</td>\n",
       "      <td>currency 1</td>\n",
       "      <td>-203</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>90000.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Credit card</td>\n",
       "      <td>-16</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>215354</td>\n",
       "      <td>5714466</td>\n",
       "      <td>Active</td>\n",
       "      <td>currency 1</td>\n",
       "      <td>-629</td>\n",
       "      <td>0</td>\n",
       "      <td>1197.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>77674.5</td>\n",
       "      <td>0</td>\n",
       "      <td>2700000.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "      <td>Consumer credit</td>\n",
       "      <td>-21</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  SK_ID_BUREAU CREDIT_ACTIVE CREDIT_CURRENCY  DAYS_CREDIT  \\\n",
       "0      215354       5714462        Closed      currency 1         -497   \n",
       "1      215354       5714463        Active      currency 1         -208   \n",
       "2      215354       5714464        Active      currency 1         -203   \n",
       "3      215354       5714465        Active      currency 1         -203   \n",
       "4      215354       5714466        Active      currency 1         -629   \n",
       "\n",
       "   CREDIT_DAY_OVERDUE  DAYS_CREDIT_ENDDATE  DAYS_ENDDATE_FACT  \\\n",
       "0                   0               -153.0             -153.0   \n",
       "1                   0               1075.0                NaN   \n",
       "2                   0                528.0                NaN   \n",
       "3                   0                  NaN                NaN   \n",
       "4                   0               1197.0                NaN   \n",
       "\n",
       "   AMT_CREDIT_MAX_OVERDUE  CNT_CREDIT_PROLONG  AMT_CREDIT_SUM  \\\n",
       "0                     NaN                   0         91323.0   \n",
       "1                     NaN                   0        225000.0   \n",
       "2                     NaN                   0        464323.5   \n",
       "3                     NaN                   0         90000.0   \n",
       "4                 77674.5                   0       2700000.0   \n",
       "\n",
       "   AMT_CREDIT_SUM_DEBT  AMT_CREDIT_SUM_LIMIT  AMT_CREDIT_SUM_OVERDUE  \\\n",
       "0                  0.0                   NaN                     0.0   \n",
       "1             171342.0                   NaN                     0.0   \n",
       "2                  NaN                   NaN                     0.0   \n",
       "3                  NaN                   NaN                     0.0   \n",
       "4                  NaN                   NaN                     0.0   \n",
       "\n",
       "       CREDIT_TYPE  DAYS_CREDIT_UPDATE  AMT_ANNUITY  \n",
       "0  Consumer credit                -131          NaN  \n",
       "1      Credit card                 -20          NaN  \n",
       "2  Consumer credit                 -16          NaN  \n",
       "3      Credit card                 -16          NaN  \n",
       "4  Consumer credit                 -21          NaN  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读入bureau属性\n",
    "bureau = pd.read_csv('bureau.csv')\n",
    "bureau.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>previous_loan_counts</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  previous_loan_counts\n",
       "0      100001                     7\n",
       "1      100002                     8\n",
       "2      100003                     4\n",
       "3      100004                     2\n",
       "4      100005                     3"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按照客户id (SK_ID_CURR) 进行Groupeby操作，计算历史贷款总数，并将SK_ID_BUREAU列重命名为previous_loan_counts\n",
    "previous_loan_counts = bureau.groupby('SK_ID_CURR', as_index = False)['SK_ID_BUREAU'].count().rename(columns = {'SK_ID_BUREAU': 'previous_loan_counts'})\n",
    "previous_loan_counts.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>TARGET</th>\n",
       "      <th>NAME_CONTRACT_TYPE</th>\n",
       "      <th>CODE_GENDER</th>\n",
       "      <th>FLAG_OWN_CAR</th>\n",
       "      <th>FLAG_OWN_REALTY</th>\n",
       "      <th>CNT_CHILDREN</th>\n",
       "      <th>AMT_INCOME_TOTAL</th>\n",
       "      <th>AMT_CREDIT</th>\n",
       "      <th>AMT_ANNUITY</th>\n",
       "      <th>...</th>\n",
       "      <th>FLAG_DOCUMENT_19</th>\n",
       "      <th>FLAG_DOCUMENT_20</th>\n",
       "      <th>FLAG_DOCUMENT_21</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_HOUR</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_DAY</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_WEEK</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_MON</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_QRT</th>\n",
       "      <th>AMT_REQ_CREDIT_BUREAU_YEAR</th>\n",
       "      <th>previous_loan_counts</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100002</td>\n",
       "      <td>1</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>202500.0</td>\n",
       "      <td>406597.5</td>\n",
       "      <td>24700.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>8.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100003</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>N</td>\n",
       "      <td>0</td>\n",
       "      <td>270000.0</td>\n",
       "      <td>1293502.5</td>\n",
       "      <td>35698.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100004</td>\n",
       "      <td>0</td>\n",
       "      <td>Revolving loans</td>\n",
       "      <td>M</td>\n",
       "      <td>Y</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>67500.0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>6750.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100006</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>312682.5</td>\n",
       "      <td>29686.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100007</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>121500.0</td>\n",
       "      <td>513000.0</td>\n",
       "      <td>21865.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 123 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  TARGET NAME_CONTRACT_TYPE CODE_GENDER FLAG_OWN_CAR  \\\n",
       "0      100002       1         Cash loans           M            N   \n",
       "1      100003       0         Cash loans           F            N   \n",
       "2      100004       0    Revolving loans           M            Y   \n",
       "3      100006       0         Cash loans           F            N   \n",
       "4      100007       0         Cash loans           M            N   \n",
       "\n",
       "  FLAG_OWN_REALTY  CNT_CHILDREN  AMT_INCOME_TOTAL  AMT_CREDIT  AMT_ANNUITY  \\\n",
       "0               Y             0          202500.0    406597.5      24700.5   \n",
       "1               N             0          270000.0   1293502.5      35698.5   \n",
       "2               Y             0           67500.0    135000.0       6750.0   \n",
       "3               Y             0          135000.0    312682.5      29686.5   \n",
       "4               Y             0          121500.0    513000.0      21865.5   \n",
       "\n",
       "           ...           FLAG_DOCUMENT_19 FLAG_DOCUMENT_20 FLAG_DOCUMENT_21  \\\n",
       "0          ...                          0                0                0   \n",
       "1          ...                          0                0                0   \n",
       "2          ...                          0                0                0   \n",
       "3          ...                          0                0                0   \n",
       "4          ...                          0                0                0   \n",
       "\n",
       "  AMT_REQ_CREDIT_BUREAU_HOUR AMT_REQ_CREDIT_BUREAU_DAY  \\\n",
       "0                        0.0                       0.0   \n",
       "1                        0.0                       0.0   \n",
       "2                        0.0                       0.0   \n",
       "3                        NaN                       NaN   \n",
       "4                        0.0                       0.0   \n",
       "\n",
       "  AMT_REQ_CREDIT_BUREAU_WEEK  AMT_REQ_CREDIT_BUREAU_MON  \\\n",
       "0                        0.0                        0.0   \n",
       "1                        0.0                        0.0   \n",
       "2                        0.0                        0.0   \n",
       "3                        NaN                        NaN   \n",
       "4                        0.0                        0.0   \n",
       "\n",
       "   AMT_REQ_CREDIT_BUREAU_QRT  AMT_REQ_CREDIT_BUREAU_YEAR  previous_loan_counts  \n",
       "0                        0.0                         1.0                   8.0  \n",
       "1                        0.0                         0.0                   4.0  \n",
       "2                        0.0                         0.0                   2.0  \n",
       "3                        NaN                         NaN                   0.0  \n",
       "4                        0.0                         0.0                   1.0  \n",
       "\n",
       "[5 rows x 123 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将计算得到的previous_loan_counts列加入原先的训练数据application_train.csv\n",
    "train = pd.read_csv('application_train.csv')\n",
    "train = train.merge(previous_loan_counts, on = 'SK_ID_CURR', how = 'left')# 左连接，左侧DataFrame取全部，右侧DataFrame取部分\n",
    "\n",
    "# 填补缺失值\n",
    "train['previous_loan_counts'] = train['previous_loan_counts'].fillna(0)\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "向左滑动查看新插入的列"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 使用r值检验方法评估新属性（变量）\n",
    "为了确定新加入的变量是否有用，我们计算了该变量与目标值之间的皮尔森相关系数(Pearson Correlation Coeffcient, r-value)。该系数可以评估两个变量之间的线性关系强弱，范围在[-1, 1]之间。r值检验方法并不是检验新变量“有效性”最好的方法，但是它可以给出一个新变量对于机器学习模型是否有帮助的初步估计。新变量r值检验的值越大，那么该变量的改变对于目标值的影响就越大。因此,我们希望寻找到与目标值的之间，皮尔森相关系数绝对值最大的新变量"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 核密度估计图\n",
    "核密度估计图展示的是一个单独变量的分布（可以将其看做一个平滑的直方图），为了看到某个分类中变量的值对分布函数的影响，我们根据类别对不同的分布使用不同的颜色标注。例如，我们可以通过目标值为1或0来判断previous_loan_count变量的核密度估计，所得到的KDE可以显示出未偿还贷款的人(TARGET==1)和偿还贷款的人(TARGET==0)之间变量分布的所有显著性差异，这将作为变量是否与机器学习模型相关的指标\n",
    "\n",
    "我们将把这个绘图功能放在一个函数中，以便对任何变量重复使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 绘制根据不同目标值着色的变量分布\n",
    "def kde_target(var_name, df):\n",
    "    \n",
    "    # 计算变量与目标值之间的皮尔森相关系数\n",
    "    corr = df['TARGET'].corr(df[var_name])\n",
    "    \n",
    "    # 计算偿还或未偿还贷款数据的中位数\n",
    "    avg_repaid = df.ix[df['TARGET'] == 0, var_name].median()# df.ix：索引函数，既可以通过行号索引，也可以通过行标签索引\n",
    "    avg_not_repaid = df.ix[df['TARGET'] == 1, var_name].median()\n",
    "    \n",
    "    plt.figure(figsize = (12, 6))\n",
    "    \n",
    "    # 绘制偿还或未偿还贷款数据的分布\n",
    "    sns.kdeplot(df.ix[df['TARGET'] == 0, var_name], label = 'TARGET == 0')\n",
    "    sns.kdeplot(df.ix[df['TARGET'] == 1, var_name], label = 'TARGET == 1')\n",
    "    \n",
    "    # 标签绘制\n",
    "    plt.xlabel(var_name); plt.ylabel('Density'); plt.title('%s Distribution' % var_name)\n",
    "    plt.legend();# 显示图例\n",
    "    \n",
    "    # 输出皮尔森相关系数\n",
    "    print('The correlation between %s and the TARGET is %0.4f' % (var_name, corr))\n",
    "    # 输出均值\n",
    "    print('Median value for loan that was not repaid = %0.4f' % avg_not_repaid)\n",
    "    print('Median value for loan that was repaid =     %0.4f' % avg_repaid)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以利用EXT_SOURCE_3变量来测试该方程，这是根据随机森林和梯度提升机得出的最佳变量https://www.kaggle.com/willkoehrsen/start-here-a-gentle-introduction"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The correlation between EXT_SOURCE_3 and the TARGET is -0.1789\n",
      "Median value for loan that was not repaid = 0.3791\n",
      "Median value for loan that was repaid =     0.5460\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1774f3236d8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kde_target('EXT_SOURCE_3', train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来对新变量previous_loan_counts进行同样的操作"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The correlation between previous_loan_counts and the TARGET is -0.0100\n",
      "Median value for loan that was not repaid = 3.0000\n",
      "Median value for loan that was repaid =     4.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1774f323240>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kde_target('previous_loan_counts', train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从图上看，很难说这个变量是否重要。相关系数很弱并且分布几乎没有什么显著差异\n",
    "\n",
    "让我们继续从bureau数据中尝试生成更多变量，我们考虑每个数值列的均值，最小值和最大值 "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 聚合数值列\n",
    "为了考虑bureau数据集中的数值信息，我们对所有数值列做一些计算处理。\n",
    "为此，我们将数据按照用户id分组(groupby)，分组后的数据再进行聚合(agg)操作，最后将结果合并(merge)到训练数据集中。由于聚合(agg)操作只能在数值型数据中使用，所有我们只计算数值列的值。在这里我们依然使用均值(mean)、最大值(max)、最小值(min)和总和(sum)函数，但事实上任何函数都可以在agg函数中被调用，甚至包括自己编写的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th colspan=\"5\" halign=\"left\">DAYS_CREDIT</th>\n",
       "      <th colspan=\"4\" halign=\"left\">CREDIT_DAY_OVERDUE</th>\n",
       "      <th>...</th>\n",
       "      <th colspan=\"5\" halign=\"left\">DAYS_CREDIT_UPDATE</th>\n",
       "      <th colspan=\"5\" halign=\"left\">AMT_ANNUITY</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>sum</th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>...</th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>sum</th>\n",
       "      <th>count</th>\n",
       "      <th>mean</th>\n",
       "      <th>max</th>\n",
       "      <th>min</th>\n",
       "      <th>sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "      <td>-735.000000</td>\n",
       "      <td>-49</td>\n",
       "      <td>-1572</td>\n",
       "      <td>-5145</td>\n",
       "      <td>7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>-93.142857</td>\n",
       "      <td>-6</td>\n",
       "      <td>-155</td>\n",
       "      <td>-652</td>\n",
       "      <td>7</td>\n",
       "      <td>3545.357143</td>\n",
       "      <td>10822.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24817.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103</td>\n",
       "      <td>-1437</td>\n",
       "      <td>-6992</td>\n",
       "      <td>8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>-499.875000</td>\n",
       "      <td>-7</td>\n",
       "      <td>-1185</td>\n",
       "      <td>-3999</td>\n",
       "      <td>7</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606</td>\n",
       "      <td>-2586</td>\n",
       "      <td>-5603</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>-816.000000</td>\n",
       "      <td>-43</td>\n",
       "      <td>-2131</td>\n",
       "      <td>-3264</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408</td>\n",
       "      <td>-1326</td>\n",
       "      <td>-1734</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>-532.000000</td>\n",
       "      <td>-382</td>\n",
       "      <td>-682</td>\n",
       "      <td>-1064</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "      <td>-190.666667</td>\n",
       "      <td>-62</td>\n",
       "      <td>-373</td>\n",
       "      <td>-572</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>-54.333333</td>\n",
       "      <td>-11</td>\n",
       "      <td>-121</td>\n",
       "      <td>-163</td>\n",
       "      <td>3</td>\n",
       "      <td>1420.500000</td>\n",
       "      <td>4261.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4261.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "  SK_ID_CURR DAYS_CREDIT                               CREDIT_DAY_OVERDUE  \\\n",
       "                   count         mean  max   min   sum              count   \n",
       "0     100001           7  -735.000000  -49 -1572 -5145                  7   \n",
       "1     100002           8  -874.000000 -103 -1437 -6992                  8   \n",
       "2     100003           4 -1400.750000 -606 -2586 -5603                  4   \n",
       "3     100004           2  -867.000000 -408 -1326 -1734                  2   \n",
       "4     100005           3  -190.666667  -62  -373  -572                  3   \n",
       "\n",
       "                 ...    DAYS_CREDIT_UPDATE                               \\\n",
       "  mean max min   ...                 count        mean  max   min   sum   \n",
       "0  0.0   0   0   ...                     7  -93.142857   -6  -155  -652   \n",
       "1  0.0   0   0   ...                     8 -499.875000   -7 -1185 -3999   \n",
       "2  0.0   0   0   ...                     4 -816.000000  -43 -2131 -3264   \n",
       "3  0.0   0   0   ...                     2 -532.000000 -382  -682 -1064   \n",
       "4  0.0   0   0   ...                     3  -54.333333  -11  -121  -163   \n",
       "\n",
       "  AMT_ANNUITY                                      \n",
       "        count         mean      max  min      sum  \n",
       "0           7  3545.357143  10822.5  0.0  24817.5  \n",
       "1           7     0.000000      0.0  0.0      0.0  \n",
       "2           0          NaN      NaN  NaN      0.0  \n",
       "3           0          NaN      NaN  NaN      0.0  \n",
       "4           3  1420.500000   4261.5  0.0   4261.5  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按照用户id分组并聚合数据\n",
    "bureau_agg = bureau.drop(columns = ['SK_ID_BUREAU']).groupby('SK_ID_CURR', as_index = False).agg(['count', 'mean', 'max', 'min', 'sum']).reset_index()\n",
    "bureau_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们需要为每一列创建新的名称。下面的代码通过结合bureau字段生成新名称。但是利用上述方法生成数据文件具有多级索引，我发现这会让这些数据变得难以理解和处理，所以我想尽快将其削减为单级结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 列表的列名称\n",
    "columns = ['SK_ID_CURR']\n",
    "\n",
    "# 根据变量名迭代\n",
    "for var in bureau_agg.columns.levels[0]:\n",
    "    # 跳过id名（因为id名的mean、max...统计量没有任何意义）\n",
    "    if var != 'SK_ID_CURR':\n",
    "    \n",
    "        #通过结合bureau字段生成新名称\n",
    "        for stat in bureau_agg.columns.levels[1][:-1]:# 遍历第二行的所有列\n",
    "            columns.append('bureau_%s_%s' % (var, stat))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>bureau_DAYS_CREDIT_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_sum</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_count</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_mean</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_max</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_min</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_sum</th>\n",
       "      <th>bureau_AMT_ANNUITY_count</th>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <th>bureau_AMT_ANNUITY_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "      <td>-735.000000</td>\n",
       "      <td>-49</td>\n",
       "      <td>-1572</td>\n",
       "      <td>-5145</td>\n",
       "      <td>7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>-93.142857</td>\n",
       "      <td>-6</td>\n",
       "      <td>-155</td>\n",
       "      <td>-652</td>\n",
       "      <td>7</td>\n",
       "      <td>3545.357143</td>\n",
       "      <td>10822.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24817.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103</td>\n",
       "      <td>-1437</td>\n",
       "      <td>-6992</td>\n",
       "      <td>8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>-499.875000</td>\n",
       "      <td>-7</td>\n",
       "      <td>-1185</td>\n",
       "      <td>-3999</td>\n",
       "      <td>7</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606</td>\n",
       "      <td>-2586</td>\n",
       "      <td>-5603</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>-816.000000</td>\n",
       "      <td>-43</td>\n",
       "      <td>-2131</td>\n",
       "      <td>-3264</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408</td>\n",
       "      <td>-1326</td>\n",
       "      <td>-1734</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>-532.000000</td>\n",
       "      <td>-382</td>\n",
       "      <td>-682</td>\n",
       "      <td>-1064</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "      <td>-190.666667</td>\n",
       "      <td>-62</td>\n",
       "      <td>-373</td>\n",
       "      <td>-572</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>-54.333333</td>\n",
       "      <td>-11</td>\n",
       "      <td>-121</td>\n",
       "      <td>-163</td>\n",
       "      <td>3</td>\n",
       "      <td>1420.500000</td>\n",
       "      <td>4261.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4261.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  bureau_DAYS_CREDIT_count  bureau_DAYS_CREDIT_mean  \\\n",
       "0      100001                         7              -735.000000   \n",
       "1      100002                         8              -874.000000   \n",
       "2      100003                         4             -1400.750000   \n",
       "3      100004                         2              -867.000000   \n",
       "4      100005                         3              -190.666667   \n",
       "\n",
       "   bureau_DAYS_CREDIT_max  bureau_DAYS_CREDIT_min  bureau_DAYS_CREDIT_sum  \\\n",
       "0                     -49                   -1572                   -5145   \n",
       "1                    -103                   -1437                   -6992   \n",
       "2                    -606                   -2586                   -5603   \n",
       "3                    -408                   -1326                   -1734   \n",
       "4                     -62                    -373                    -572   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_count  bureau_CREDIT_DAY_OVERDUE_mean  \\\n",
       "0                                7                             0.0   \n",
       "1                                8                             0.0   \n",
       "2                                4                             0.0   \n",
       "3                                2                             0.0   \n",
       "4                                3                             0.0   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_max  bureau_CREDIT_DAY_OVERDUE_min  \\\n",
       "0                              0                              0   \n",
       "1                              0                              0   \n",
       "2                              0                              0   \n",
       "3                              0                              0   \n",
       "4                              0                              0   \n",
       "\n",
       "            ...            bureau_DAYS_CREDIT_UPDATE_count  \\\n",
       "0           ...                                          7   \n",
       "1           ...                                          8   \n",
       "2           ...                                          4   \n",
       "3           ...                                          2   \n",
       "4           ...                                          3   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_mean  bureau_DAYS_CREDIT_UPDATE_max  \\\n",
       "0                      -93.142857                             -6   \n",
       "1                     -499.875000                             -7   \n",
       "2                     -816.000000                            -43   \n",
       "3                     -532.000000                           -382   \n",
       "4                      -54.333333                            -11   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_min  bureau_DAYS_CREDIT_UPDATE_sum  \\\n",
       "0                           -155                           -652   \n",
       "1                          -1185                          -3999   \n",
       "2                          -2131                          -3264   \n",
       "3                           -682                          -1064   \n",
       "4                           -121                           -163   \n",
       "\n",
       "   bureau_AMT_ANNUITY_count  bureau_AMT_ANNUITY_mean  bureau_AMT_ANNUITY_max  \\\n",
       "0                         7              3545.357143                 10822.5   \n",
       "1                         7                 0.000000                     0.0   \n",
       "2                         0                      NaN                     NaN   \n",
       "3                         0                      NaN                     NaN   \n",
       "4                         3              1420.500000                  4261.5   \n",
       "\n",
       "   bureau_AMT_ANNUITY_min  bureau_AMT_ANNUITY_sum  \n",
       "0                     0.0                 24817.5  \n",
       "1                     0.0                     0.0  \n",
       "2                     NaN                     0.0  \n",
       "3                     NaN                     0.0  \n",
       "4                     0.0                  4261.5  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 将生成的类名列表作为新的类名\n",
    "bureau_agg.columns = columns\n",
    "bureau_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们只需要简单地将之前处理好的数据与训练数据结合在一起"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>TARGET</th>\n",
       "      <th>NAME_CONTRACT_TYPE</th>\n",
       "      <th>CODE_GENDER</th>\n",
       "      <th>FLAG_OWN_CAR</th>\n",
       "      <th>FLAG_OWN_REALTY</th>\n",
       "      <th>CNT_CHILDREN</th>\n",
       "      <th>AMT_INCOME_TOTAL</th>\n",
       "      <th>AMT_CREDIT</th>\n",
       "      <th>AMT_ANNUITY</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_sum</th>\n",
       "      <th>bureau_AMT_ANNUITY_count</th>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <th>bureau_AMT_ANNUITY_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100002</td>\n",
       "      <td>1</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>202500.0</td>\n",
       "      <td>406597.5</td>\n",
       "      <td>24700.5</td>\n",
       "      <td>...</td>\n",
       "      <td>8.0</td>\n",
       "      <td>-499.875</td>\n",
       "      <td>-7.0</td>\n",
       "      <td>-1185.0</td>\n",
       "      <td>-3999.0</td>\n",
       "      <td>7.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100003</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>N</td>\n",
       "      <td>0</td>\n",
       "      <td>270000.0</td>\n",
       "      <td>1293502.5</td>\n",
       "      <td>35698.5</td>\n",
       "      <td>...</td>\n",
       "      <td>4.0</td>\n",
       "      <td>-816.000</td>\n",
       "      <td>-43.0</td>\n",
       "      <td>-2131.0</td>\n",
       "      <td>-3264.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100004</td>\n",
       "      <td>0</td>\n",
       "      <td>Revolving loans</td>\n",
       "      <td>M</td>\n",
       "      <td>Y</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>67500.0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>6750.0</td>\n",
       "      <td>...</td>\n",
       "      <td>2.0</td>\n",
       "      <td>-532.000</td>\n",
       "      <td>-382.0</td>\n",
       "      <td>-682.0</td>\n",
       "      <td>-1064.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100006</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>312682.5</td>\n",
       "      <td>29686.5</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100007</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>121500.0</td>\n",
       "      <td>513000.0</td>\n",
       "      <td>21865.5</td>\n",
       "      <td>...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>-783.000</td>\n",
       "      <td>-783.0</td>\n",
       "      <td>-783.0</td>\n",
       "      <td>-783.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 183 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  TARGET NAME_CONTRACT_TYPE CODE_GENDER FLAG_OWN_CAR  \\\n",
       "0      100002       1         Cash loans           M            N   \n",
       "1      100003       0         Cash loans           F            N   \n",
       "2      100004       0    Revolving loans           M            Y   \n",
       "3      100006       0         Cash loans           F            N   \n",
       "4      100007       0         Cash loans           M            N   \n",
       "\n",
       "  FLAG_OWN_REALTY  CNT_CHILDREN  AMT_INCOME_TOTAL  AMT_CREDIT  AMT_ANNUITY  \\\n",
       "0               Y             0          202500.0    406597.5      24700.5   \n",
       "1               N             0          270000.0   1293502.5      35698.5   \n",
       "2               Y             0           67500.0    135000.0       6750.0   \n",
       "3               Y             0          135000.0    312682.5      29686.5   \n",
       "4               Y             0          121500.0    513000.0      21865.5   \n",
       "\n",
       "            ...            bureau_DAYS_CREDIT_UPDATE_count  \\\n",
       "0           ...                                        8.0   \n",
       "1           ...                                        4.0   \n",
       "2           ...                                        2.0   \n",
       "3           ...                                        NaN   \n",
       "4           ...                                        1.0   \n",
       "\n",
       "  bureau_DAYS_CREDIT_UPDATE_mean bureau_DAYS_CREDIT_UPDATE_max  \\\n",
       "0                       -499.875                          -7.0   \n",
       "1                       -816.000                         -43.0   \n",
       "2                       -532.000                        -382.0   \n",
       "3                            NaN                           NaN   \n",
       "4                       -783.000                        -783.0   \n",
       "\n",
       "  bureau_DAYS_CREDIT_UPDATE_min bureau_DAYS_CREDIT_UPDATE_sum  \\\n",
       "0                       -1185.0                       -3999.0   \n",
       "1                       -2131.0                       -3264.0   \n",
       "2                        -682.0                       -1064.0   \n",
       "3                           NaN                           NaN   \n",
       "4                        -783.0                        -783.0   \n",
       "\n",
       "  bureau_AMT_ANNUITY_count  bureau_AMT_ANNUITY_mean  bureau_AMT_ANNUITY_max  \\\n",
       "0                      7.0                      0.0                     0.0   \n",
       "1                      0.0                      NaN                     NaN   \n",
       "2                      0.0                      NaN                     NaN   \n",
       "3                      NaN                      NaN                     NaN   \n",
       "4                      0.0                      NaN                     NaN   \n",
       "\n",
       "   bureau_AMT_ANNUITY_min  bureau_AMT_ANNUITY_sum  \n",
       "0                     0.0                     0.0  \n",
       "1                     NaN                     0.0  \n",
       "2                     NaN                     0.0  \n",
       "3                     NaN                     NaN  \n",
       "4                     NaN                     0.0  \n",
       "\n",
       "[5 rows x 183 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 与训练数据结合\n",
    "train = train.merge(bureau_agg, on = 'SK_ID_CURR', how = 'left')\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 聚合值和目标的相关性\n",
    "我们可以计算新的变量与目标值之间的相关性，同样的，我们可以用该相关系数作为变量对于模型重要性的一个估计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 相关系数列表\n",
    "new_corrs = []\n",
    "\n",
    "# 根据变量名迭代\n",
    "for col in columns:\n",
    "    # 计算与目标值之间的相关系数\n",
    "    corr = train['TARGET'].corr(train[col])\n",
    "    \n",
    "    \n",
    "    # 以tuple的形式存入list中\n",
    "    \n",
    "    \n",
    "    new_corrs.append((col, corr))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在下面的代码中，我们使用Python中的排序函数来对相关系数按照绝对值的大小进行排序。同时，我们还使用了Python中的另一个重要操作——匿名函数lambda"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('bureau_DAYS_CREDIT_mean', 0.089728967219981),\n",
       " ('bureau_DAYS_CREDIT_min', 0.07524825103010374),\n",
       " ('bureau_DAYS_CREDIT_UPDATE_mean', 0.06892735266968684),\n",
       " ('bureau_DAYS_ENDDATE_FACT_min', 0.055887379843920795),\n",
       " ('bureau_DAYS_CREDIT_ENDDATE_sum', 0.053734895601020585),\n",
       " ('bureau_DAYS_ENDDATE_FACT_mean', 0.05319962585758622),\n",
       " ('bureau_DAYS_CREDIT_max', 0.04978205463997309),\n",
       " ('bureau_DAYS_ENDDATE_FACT_sum', 0.048853502611115936),\n",
       " ('bureau_DAYS_CREDIT_ENDDATE_mean', 0.04698275433483553),\n",
       " ('bureau_DAYS_CREDIT_UPDATE_min', 0.04286392247073023),\n",
       " ('bureau_DAYS_CREDIT_sum', 0.04199982481484667),\n",
       " ('bureau_DAYS_CREDIT_UPDATE_sum', 0.0414036353530601),\n",
       " ('bureau_DAYS_CREDIT_ENDDATE_max', 0.03658963469632898),\n",
       " ('bureau_DAYS_CREDIT_ENDDATE_min', 0.034281109921615996),\n",
       " ('bureau_DAYS_ENDDATE_FACT_count', -0.03049230665332547)]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 对相关系数按照绝对值的大小进行排序\n",
    "# 使用反转操作，确保最大值在list的最前面\n",
    "new_corrs = sorted(new_corrs, key = lambda x: abs(x[1]), reverse = True)\n",
    "new_corrs[:15] # 输出前15个数据"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "没有一个新变量与目标值TARGET有显著的相关性。我们可以从KDE图中看出，最高相关性的向量——bureau_DAYS_CREDIT_mean与目标值TARGET在绝对值方面的相关性"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The correlation between bureau_DAYS_CREDIT_mean and the TARGET is 0.0897\n",
      "Median value for loan that was not repaid = -835.3333\n",
      "Median value for loan that was repaid =     -1067.0000\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x177000935f8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "kde_target('bureau_DAYS_CREDIT_mean', train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这一列的定义是：客户前一次申请贷款距离现在的天数。我的解释是：这是在此次申请捷信公司贷款之前，距离上一次向其他金融机构申请贷款中间所隔的天数。因此，负数的绝对值越大，意味着前一次的贷款越久远(-835.333/-1067)。我们看到，这个变量的平均值与目标之间存在着极弱的正相关关系，这意味着更早之前申请贷款的客户更有可能向Home Credit偿还贷款（不违约），尽管这种微弱的相关性很可能是噪声"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 多重比较问题\n",
    "让我们将之前的工作封装成一个函数，这样就可以在任何数值型数据中使用该方法。当我们想要对其他数据进行同样的操作时，只需要重用该函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def agg_numeric(df, group_var, df_name):\n",
    "    \"\"\"聚合数值型数据，可以用于为每个分组变量的实例创建新特征\n",
    "    \n",
    "    参数\n",
    "    --------\n",
    "        df (dataframe): \n",
    "            数据文件\n",
    "        group_var (string): \n",
    "            用于将数据文件分组的变量\n",
    "        df_name (string): \n",
    "            用于重命名列名的变量\n",
    "            \n",
    "    返回值\n",
    "    --------\n",
    "        agg (dataframe): \n",
    "            包含所有数值列聚合后统计量的数据文件，分组变量的每个实例都将计算出相应的统计量（平均值、最小值、最大值和总和）\n",
    "            为了便于追踪所创建这些新变量，这些数值列同时会被重命名  \n",
    "    \"\"\"\n",
    "    # 除去分组变量以外的id变量\n",
    "    for col in df:\n",
    "        if col != group_var and 'SK_ID' in col:\n",
    "            df = df.drop(columns = col)\n",
    "            \n",
    "    group_ids = df[group_var]\n",
    "    numeric_df = df.select_dtypes('number') # 选择数值列【df只剩下id列和需要分组的列？】\n",
    "    numeric_df[group_var] = group_ids\n",
    "    \n",
    "    # 通过指定变量分组并计算统计数据\n",
    "    agg = numeric_df.groupby(group_var).agg(['count', 'mean', 'max', 'min', 'sum']).reset_index()\n",
    "    \n",
    "    # 需要新建一个列名\n",
    "    columns = [group_var]\n",
    "    \n",
    "    # 根据变量名迭代\n",
    "    for var in agg.columns.levels[0]:\n",
    "        # 跳过分组变量\n",
    "        if var != group_var:\n",
    "            #通过结合相关字段生成新名称\n",
    "            for stat in agg.columns.levels[1][:-1]:\n",
    "                columns.append('%s_%s_%s' % (df_name, var, stat))\n",
    "    \n",
    "    agg.columns = columns\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>bureau_DAYS_CREDIT_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_sum</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_count</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_mean</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_max</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_min</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_sum</th>\n",
       "      <th>bureau_AMT_ANNUITY_count</th>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <th>bureau_AMT_ANNUITY_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "      <td>-735.000000</td>\n",
       "      <td>-49</td>\n",
       "      <td>-1572</td>\n",
       "      <td>-5145</td>\n",
       "      <td>7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>-93.142857</td>\n",
       "      <td>-6</td>\n",
       "      <td>-155</td>\n",
       "      <td>-652</td>\n",
       "      <td>7</td>\n",
       "      <td>3545.357143</td>\n",
       "      <td>10822.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24817.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103</td>\n",
       "      <td>-1437</td>\n",
       "      <td>-6992</td>\n",
       "      <td>8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>-499.875000</td>\n",
       "      <td>-7</td>\n",
       "      <td>-1185</td>\n",
       "      <td>-3999</td>\n",
       "      <td>7</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606</td>\n",
       "      <td>-2586</td>\n",
       "      <td>-5603</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>-816.000000</td>\n",
       "      <td>-43</td>\n",
       "      <td>-2131</td>\n",
       "      <td>-3264</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408</td>\n",
       "      <td>-1326</td>\n",
       "      <td>-1734</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>-532.000000</td>\n",
       "      <td>-382</td>\n",
       "      <td>-682</td>\n",
       "      <td>-1064</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "      <td>-190.666667</td>\n",
       "      <td>-62</td>\n",
       "      <td>-373</td>\n",
       "      <td>-572</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>-54.333333</td>\n",
       "      <td>-11</td>\n",
       "      <td>-121</td>\n",
       "      <td>-163</td>\n",
       "      <td>3</td>\n",
       "      <td>1420.500000</td>\n",
       "      <td>4261.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4261.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  bureau_DAYS_CREDIT_count  bureau_DAYS_CREDIT_mean  \\\n",
       "0      100001                         7              -735.000000   \n",
       "1      100002                         8              -874.000000   \n",
       "2      100003                         4             -1400.750000   \n",
       "3      100004                         2              -867.000000   \n",
       "4      100005                         3              -190.666667   \n",
       "\n",
       "   bureau_DAYS_CREDIT_max  bureau_DAYS_CREDIT_min  bureau_DAYS_CREDIT_sum  \\\n",
       "0                     -49                   -1572                   -5145   \n",
       "1                    -103                   -1437                   -6992   \n",
       "2                    -606                   -2586                   -5603   \n",
       "3                    -408                   -1326                   -1734   \n",
       "4                     -62                    -373                    -572   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_count  bureau_CREDIT_DAY_OVERDUE_mean  \\\n",
       "0                                7                             0.0   \n",
       "1                                8                             0.0   \n",
       "2                                4                             0.0   \n",
       "3                                2                             0.0   \n",
       "4                                3                             0.0   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_max  bureau_CREDIT_DAY_OVERDUE_min  \\\n",
       "0                              0                              0   \n",
       "1                              0                              0   \n",
       "2                              0                              0   \n",
       "3                              0                              0   \n",
       "4                              0                              0   \n",
       "\n",
       "            ...            bureau_DAYS_CREDIT_UPDATE_count  \\\n",
       "0           ...                                          7   \n",
       "1           ...                                          8   \n",
       "2           ...                                          4   \n",
       "3           ...                                          2   \n",
       "4           ...                                          3   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_mean  bureau_DAYS_CREDIT_UPDATE_max  \\\n",
       "0                      -93.142857                             -6   \n",
       "1                     -499.875000                             -7   \n",
       "2                     -816.000000                            -43   \n",
       "3                     -532.000000                           -382   \n",
       "4                      -54.333333                            -11   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_min  bureau_DAYS_CREDIT_UPDATE_sum  \\\n",
       "0                           -155                           -652   \n",
       "1                          -1185                          -3999   \n",
       "2                          -2131                          -3264   \n",
       "3                           -682                          -1064   \n",
       "4                           -121                           -163   \n",
       "\n",
       "   bureau_AMT_ANNUITY_count  bureau_AMT_ANNUITY_mean  bureau_AMT_ANNUITY_max  \\\n",
       "0                         7              3545.357143                 10822.5   \n",
       "1                         7                 0.000000                     0.0   \n",
       "2                         0                      NaN                     NaN   \n",
       "3                         0                      NaN                     NaN   \n",
       "4                         3              1420.500000                  4261.5   \n",
       "\n",
       "   bureau_AMT_ANNUITY_min  bureau_AMT_ANNUITY_sum  \n",
       "0                     0.0                 24817.5  \n",
       "1                     0.0                     0.0  \n",
       "2                     NaN                     0.0  \n",
       "3                     NaN                     0.0  \n",
       "4                     0.0                  4261.5  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_agg_new = agg_numeric(bureau.drop(columns = ['SK_ID_BUREAU']), group_var = 'SK_ID_CURR', df_name = 'bureau')\n",
    "bureau_agg_new.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了保证该函数按照预期的效果执行，我们需要与手工创建的聚合数据做对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>bureau_DAYS_CREDIT_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_sum</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_count</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_mean</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_max</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_min</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_sum</th>\n",
       "      <th>bureau_AMT_ANNUITY_count</th>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <th>bureau_AMT_ANNUITY_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "      <td>-735.000000</td>\n",
       "      <td>-49</td>\n",
       "      <td>-1572</td>\n",
       "      <td>-5145</td>\n",
       "      <td>7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>-93.142857</td>\n",
       "      <td>-6</td>\n",
       "      <td>-155</td>\n",
       "      <td>-652</td>\n",
       "      <td>7</td>\n",
       "      <td>3545.357143</td>\n",
       "      <td>10822.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24817.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103</td>\n",
       "      <td>-1437</td>\n",
       "      <td>-6992</td>\n",
       "      <td>8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>-499.875000</td>\n",
       "      <td>-7</td>\n",
       "      <td>-1185</td>\n",
       "      <td>-3999</td>\n",
       "      <td>7</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606</td>\n",
       "      <td>-2586</td>\n",
       "      <td>-5603</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>-816.000000</td>\n",
       "      <td>-43</td>\n",
       "      <td>-2131</td>\n",
       "      <td>-3264</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408</td>\n",
       "      <td>-1326</td>\n",
       "      <td>-1734</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>-532.000000</td>\n",
       "      <td>-382</td>\n",
       "      <td>-682</td>\n",
       "      <td>-1064</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "      <td>-190.666667</td>\n",
       "      <td>-62</td>\n",
       "      <td>-373</td>\n",
       "      <td>-572</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>-54.333333</td>\n",
       "      <td>-11</td>\n",
       "      <td>-121</td>\n",
       "      <td>-163</td>\n",
       "      <td>3</td>\n",
       "      <td>1420.500000</td>\n",
       "      <td>4261.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4261.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  bureau_DAYS_CREDIT_count  bureau_DAYS_CREDIT_mean  \\\n",
       "0      100001                         7              -735.000000   \n",
       "1      100002                         8              -874.000000   \n",
       "2      100003                         4             -1400.750000   \n",
       "3      100004                         2              -867.000000   \n",
       "4      100005                         3              -190.666667   \n",
       "\n",
       "   bureau_DAYS_CREDIT_max  bureau_DAYS_CREDIT_min  bureau_DAYS_CREDIT_sum  \\\n",
       "0                     -49                   -1572                   -5145   \n",
       "1                    -103                   -1437                   -6992   \n",
       "2                    -606                   -2586                   -5603   \n",
       "3                    -408                   -1326                   -1734   \n",
       "4                     -62                    -373                    -572   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_count  bureau_CREDIT_DAY_OVERDUE_mean  \\\n",
       "0                                7                             0.0   \n",
       "1                                8                             0.0   \n",
       "2                                4                             0.0   \n",
       "3                                2                             0.0   \n",
       "4                                3                             0.0   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_max  bureau_CREDIT_DAY_OVERDUE_min  \\\n",
       "0                              0                              0   \n",
       "1                              0                              0   \n",
       "2                              0                              0   \n",
       "3                              0                              0   \n",
       "4                              0                              0   \n",
       "\n",
       "            ...            bureau_DAYS_CREDIT_UPDATE_count  \\\n",
       "0           ...                                          7   \n",
       "1           ...                                          8   \n",
       "2           ...                                          4   \n",
       "3           ...                                          2   \n",
       "4           ...                                          3   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_mean  bureau_DAYS_CREDIT_UPDATE_max  \\\n",
       "0                      -93.142857                             -6   \n",
       "1                     -499.875000                             -7   \n",
       "2                     -816.000000                            -43   \n",
       "3                     -532.000000                           -382   \n",
       "4                      -54.333333                            -11   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_min  bureau_DAYS_CREDIT_UPDATE_sum  \\\n",
       "0                           -155                           -652   \n",
       "1                          -1185                          -3999   \n",
       "2                          -2131                          -3264   \n",
       "3                           -682                          -1064   \n",
       "4                           -121                           -163   \n",
       "\n",
       "   bureau_AMT_ANNUITY_count  bureau_AMT_ANNUITY_mean  bureau_AMT_ANNUITY_max  \\\n",
       "0                         7              3545.357143                 10822.5   \n",
       "1                         7                 0.000000                     0.0   \n",
       "2                         0                      NaN                     NaN   \n",
       "3                         0                      NaN                     NaN   \n",
       "4                         3              1420.500000                  4261.5   \n",
       "\n",
       "   bureau_AMT_ANNUITY_min  bureau_AMT_ANNUITY_sum  \n",
       "0                     0.0                 24817.5  \n",
       "1                     0.0                     0.0  \n",
       "2                     NaN                     0.0  \n",
       "3                     NaN                     0.0  \n",
       "4                     0.0                  4261.5  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "观察这些值可以发现它们是等价的，所以我们可以在其他数据集上重用该函数。通过使用函数减少工作量，是我们未来需要不断努力的方向"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 相关系数函数\n",
    "在继续下一步之前，我们同样可以封装计算变量与目标值之间相关系数的函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算数据集中变量与目标值之间相关系数的函数\n",
    "def target_corrs(df):\n",
    "    \n",
    "    # 相关系数数组\n",
    "    corrs = []\n",
    "    \n",
    "    # 按列迭代\n",
    "    for col in df.columns:\n",
    "        print(col)\n",
    "        # 跳过目标列\n",
    "        if col != 'TARGET':\n",
    "            # 计算相关系数\n",
    "            corr = df['TARGET'].corr(df[col])\n",
    "            \n",
    "            # 按tuple类型插入数组中\n",
    "            corrs.append((col, corr))\n",
    "    \n",
    "    # 按照相关系数绝对值大小排序\n",
    "    corrs = sorted(corrs, key = lambda x: abs(x[1]), reverse = True)\n",
    "    \n",
    "    return corrs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 类别变量(Categorical Variables)\n",
    "现在我们从数值列转向分类列。这些是离散型的字符串变量，所以我们无法计算均值或者最大值之类的统计量。相反，我们需要计算每个类别变量中类别的数量。举个例子，如果我们有以下的数据：\n",
    "SK_ID_CURR\tLoan type\n",
    "1\thome\n",
    "1\thome\n",
    "1\thome\n",
    "1\tcredit\n",
    "2\tcredit\n",
    "3\tcredit\n",
    "3\tcash\n",
    "3\tcash\n",
    "4\tcredit\n",
    "4\thome\n",
    "4\thome\n",
    "我们将使用这些信息，计算每个客户在每个类别的贷款数量\n",
    "SK_ID_CURR\tcredit count\tcash count\thome count\ttotal count\n",
    "1\t1\t0\t3\t4\n",
    "2\t1\t0\t0\t1\n",
    "3\t1\t2\t0\t3\n",
    "4\t1\t0\t2\t3\n",
    "然后，我们可以通过该分类变量出现的总数来标准化这些数据（这意味着每行规范化后的数据总和必须为1.0）\n",
    "SK_ID_CURR\tcredit count\tcash count\thome count\ttotal count\tcredit count norm\tcash count norm\thome count norm\n",
    "1\t1\t0\t3\t4\t0.25\t0\t0.75\n",
    "2\t1\t0\t0\t1\t1.00\t0\t0\n",
    "3\t1\t2\t0\t3\t0.33\t0.66\t0\n",
    "4\t1\t0\t2\t3\t0.33\t0\t0.66\n",
    "希望用这种方式对类别变量进行编码可以获得它们所包含的信息。如果你们对这个过程有更好的想法，请在评论中告诉我！我们一步步进行这个过程，最后我将把所有的代码打包成一个函数，用于不同数据集的重用\n",
    "\n",
    "首先我们对分类列（dType＝=“object）的数据文件进行oen-hot编码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CREDIT_ACTIVE_Active</th>\n",
       "      <th>CREDIT_ACTIVE_Bad debt</th>\n",
       "      <th>CREDIT_ACTIVE_Closed</th>\n",
       "      <th>CREDIT_ACTIVE_Sold</th>\n",
       "      <th>CREDIT_CURRENCY_currency 1</th>\n",
       "      <th>CREDIT_CURRENCY_currency 2</th>\n",
       "      <th>CREDIT_CURRENCY_currency 3</th>\n",
       "      <th>CREDIT_CURRENCY_currency 4</th>\n",
       "      <th>CREDIT_TYPE_Another type of loan</th>\n",
       "      <th>CREDIT_TYPE_Car loan</th>\n",
       "      <th>...</th>\n",
       "      <th>CREDIT_TYPE_Loan for business development</th>\n",
       "      <th>CREDIT_TYPE_Loan for purchase of shares (margin lending)</th>\n",
       "      <th>CREDIT_TYPE_Loan for the purchase of equipment</th>\n",
       "      <th>CREDIT_TYPE_Loan for working capital replenishment</th>\n",
       "      <th>CREDIT_TYPE_Microloan</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan</th>\n",
       "      <th>CREDIT_TYPE_Mortgage</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan</th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>215354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>215354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>215354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>215354</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>215354</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 24 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   CREDIT_ACTIVE_Active  CREDIT_ACTIVE_Bad debt  CREDIT_ACTIVE_Closed  \\\n",
       "0                     0                       0                     1   \n",
       "1                     1                       0                     0   \n",
       "2                     1                       0                     0   \n",
       "3                     1                       0                     0   \n",
       "4                     1                       0                     0   \n",
       "\n",
       "   CREDIT_ACTIVE_Sold  CREDIT_CURRENCY_currency 1  CREDIT_CURRENCY_currency 2  \\\n",
       "0                   0                           1                           0   \n",
       "1                   0                           1                           0   \n",
       "2                   0                           1                           0   \n",
       "3                   0                           1                           0   \n",
       "4                   0                           1                           0   \n",
       "\n",
       "   CREDIT_CURRENCY_currency 3  CREDIT_CURRENCY_currency 4  \\\n",
       "0                           0                           0   \n",
       "1                           0                           0   \n",
       "2                           0                           0   \n",
       "3                           0                           0   \n",
       "4                           0                           0   \n",
       "\n",
       "   CREDIT_TYPE_Another type of loan  CREDIT_TYPE_Car loan     ...      \\\n",
       "0                                 0                     0     ...       \n",
       "1                                 0                     0     ...       \n",
       "2                                 0                     0     ...       \n",
       "3                                 0                     0     ...       \n",
       "4                                 0                     0     ...       \n",
       "\n",
       "   CREDIT_TYPE_Loan for business development  \\\n",
       "0                                          0   \n",
       "1                                          0   \n",
       "2                                          0   \n",
       "3                                          0   \n",
       "4                                          0   \n",
       "\n",
       "   CREDIT_TYPE_Loan for purchase of shares (margin lending)  \\\n",
       "0                                                  0          \n",
       "1                                                  0          \n",
       "2                                                  0          \n",
       "3                                                  0          \n",
       "4                                                  0          \n",
       "\n",
       "   CREDIT_TYPE_Loan for the purchase of equipment  \\\n",
       "0                                               0   \n",
       "1                                               0   \n",
       "2                                               0   \n",
       "3                                               0   \n",
       "4                                               0   \n",
       "\n",
       "   CREDIT_TYPE_Loan for working capital replenishment  CREDIT_TYPE_Microloan  \\\n",
       "0                                                  0                       0   \n",
       "1                                                  0                       0   \n",
       "2                                                  0                       0   \n",
       "3                                                  0                       0   \n",
       "4                                                  0                       0   \n",
       "\n",
       "   CREDIT_TYPE_Mobile operator loan  CREDIT_TYPE_Mortgage  \\\n",
       "0                                 0                     0   \n",
       "1                                 0                     0   \n",
       "2                                 0                     0   \n",
       "3                                 0                     0   \n",
       "4                                 0                     0   \n",
       "\n",
       "   CREDIT_TYPE_Real estate loan  CREDIT_TYPE_Unknown type of loan  SK_ID_CURR  \n",
       "0                             0                                 0      215354  \n",
       "1                             0                                 0      215354  \n",
       "2                             0                                 0      215354  \n",
       "3                             0                                 0      215354  \n",
       "4                             0                                 0      215354  \n",
       "\n",
       "[5 rows x 24 columns]"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用get_dummies进行one-hot编码，该方法会为列中的每个字符串创建一个新列\n",
    "categorical = pd.get_dummies(bureau.select_dtypes('object'))\n",
    "categorical['SK_ID_CURR'] = bureau['SK_ID_CURR']\n",
    "categorical.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe thead tr:last-of-type th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_ACTIVE_Active</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_ACTIVE_Bad debt</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_ACTIVE_Closed</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_ACTIVE_Sold</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_CURRENCY_currency 1</th>\n",
       "      <th>...</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_TYPE_Microloan</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_TYPE_Mobile operator loan</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_TYPE_Mortgage</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_TYPE_Real estate loan</th>\n",
       "      <th colspan=\"2\" halign=\"left\">CREDIT_TYPE_Unknown type of loan</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th></th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>...</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "      <th>sum</th>\n",
       "      <th>mean</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100001</th>\n",
       "      <td>3</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.571429</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100002</th>\n",
       "      <td>2</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100003</th>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100004</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100005</th>\n",
       "      <td>2</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           CREDIT_ACTIVE_Active           CREDIT_ACTIVE_Bad debt       \\\n",
       "                            sum      mean                    sum mean   \n",
       "SK_ID_CURR                                                              \n",
       "100001                        3  0.428571                      0  0.0   \n",
       "100002                        2  0.250000                      0  0.0   \n",
       "100003                        1  0.250000                      0  0.0   \n",
       "100004                        0  0.000000                      0  0.0   \n",
       "100005                        2  0.666667                      0  0.0   \n",
       "\n",
       "           CREDIT_ACTIVE_Closed           CREDIT_ACTIVE_Sold       \\\n",
       "                            sum      mean                sum mean   \n",
       "SK_ID_CURR                                                          \n",
       "100001                        4  0.571429                  0  0.0   \n",
       "100002                        6  0.750000                  0  0.0   \n",
       "100003                        3  0.750000                  0  0.0   \n",
       "100004                        2  1.000000                  0  0.0   \n",
       "100005                        1  0.333333                  0  0.0   \n",
       "\n",
       "           CREDIT_CURRENCY_currency 1      ...  CREDIT_TYPE_Microloan       \\\n",
       "                                  sum mean ...                    sum mean   \n",
       "SK_ID_CURR                                 ...                               \n",
       "100001                              7  1.0 ...                      0  0.0   \n",
       "100002                              8  1.0 ...                      0  0.0   \n",
       "100003                              4  1.0 ...                      0  0.0   \n",
       "100004                              2  1.0 ...                      0  0.0   \n",
       "100005                              3  1.0 ...                      0  0.0   \n",
       "\n",
       "           CREDIT_TYPE_Mobile operator loan      CREDIT_TYPE_Mortgage       \\\n",
       "                                        sum mean                  sum mean   \n",
       "SK_ID_CURR                                                                   \n",
       "100001                                    0  0.0                    0  0.0   \n",
       "100002                                    0  0.0                    0  0.0   \n",
       "100003                                    0  0.0                    0  0.0   \n",
       "100004                                    0  0.0                    0  0.0   \n",
       "100005                                    0  0.0                    0  0.0   \n",
       "\n",
       "           CREDIT_TYPE_Real estate loan      CREDIT_TYPE_Unknown type of loan  \\\n",
       "                                    sum mean                              sum   \n",
       "SK_ID_CURR                                                                      \n",
       "100001                                0  0.0                                0   \n",
       "100002                                0  0.0                                0   \n",
       "100003                                0  0.0                                0   \n",
       "100004                                0  0.0                                0   \n",
       "100005                                0  0.0                                0   \n",
       "\n",
       "                 \n",
       "           mean  \n",
       "SK_ID_CURR       \n",
       "100001      0.0  \n",
       "100002      0.0  \n",
       "100003      0.0  \n",
       "100004      0.0  \n",
       "100005      0.0  \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categorical_grouped = categorical.groupby('SK_ID_CURR').agg(['sum', 'mean'])\n",
    "categorical_grouped.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'sum'列表示的是与该类别相关联的客户总数，'mean'列表示的是其归一化计数。one-hot编码函数使得这些数值的计算变得十分容易\n",
    "\n",
    "我们可以像之前一样对列名进行重命名，同样的，我们需要处理列的多层索引问题。我们将第一级（0层）的分类变量名与one-hot编码后的值结合，迭代进行该过程。例如：sum列将会变成 CREDIT_ACTIVE_Active_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['CREDIT_ACTIVE_Active', 'CREDIT_ACTIVE_Bad debt',\n",
       "       'CREDIT_ACTIVE_Closed', 'CREDIT_ACTIVE_Sold',\n",
       "       'CREDIT_CURRENCY_currency 1', 'CREDIT_CURRENCY_currency 2',\n",
       "       'CREDIT_CURRENCY_currency 3', 'CREDIT_CURRENCY_currency 4',\n",
       "       'CREDIT_TYPE_Another type of loan', 'CREDIT_TYPE_Car loan'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categorical_grouped.columns.levels[0][:10]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['sum', 'mean'], dtype='object')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "categorical_grouped.columns.levels[1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>CREDIT_ACTIVE_Active_count</th>\n",
       "      <th>CREDIT_ACTIVE_Active_count_norm</th>\n",
       "      <th>CREDIT_ACTIVE_Bad debt_count</th>\n",
       "      <th>CREDIT_ACTIVE_Bad debt_count_norm</th>\n",
       "      <th>CREDIT_ACTIVE_Closed_count</th>\n",
       "      <th>CREDIT_ACTIVE_Closed_count_norm</th>\n",
       "      <th>CREDIT_ACTIVE_Sold_count</th>\n",
       "      <th>CREDIT_ACTIVE_Sold_count_norm</th>\n",
       "      <th>CREDIT_CURRENCY_currency 1_count</th>\n",
       "      <th>CREDIT_CURRENCY_currency 1_count_norm</th>\n",
       "      <th>...</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count_norm</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100001</th>\n",
       "      <td>3</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.571429</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100002</th>\n",
       "      <td>2</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100003</th>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100004</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100005</th>\n",
       "      <td>2</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            CREDIT_ACTIVE_Active_count  CREDIT_ACTIVE_Active_count_norm  \\\n",
       "SK_ID_CURR                                                                \n",
       "100001                               3                         0.428571   \n",
       "100002                               2                         0.250000   \n",
       "100003                               1                         0.250000   \n",
       "100004                               0                         0.000000   \n",
       "100005                               2                         0.666667   \n",
       "\n",
       "            CREDIT_ACTIVE_Bad debt_count  CREDIT_ACTIVE_Bad debt_count_norm  \\\n",
       "SK_ID_CURR                                                                    \n",
       "100001                                 0                                0.0   \n",
       "100002                                 0                                0.0   \n",
       "100003                                 0                                0.0   \n",
       "100004                                 0                                0.0   \n",
       "100005                                 0                                0.0   \n",
       "\n",
       "            CREDIT_ACTIVE_Closed_count  CREDIT_ACTIVE_Closed_count_norm  \\\n",
       "SK_ID_CURR                                                                \n",
       "100001                               4                         0.571429   \n",
       "100002                               6                         0.750000   \n",
       "100003                               3                         0.750000   \n",
       "100004                               2                         1.000000   \n",
       "100005                               1                         0.333333   \n",
       "\n",
       "            CREDIT_ACTIVE_Sold_count  CREDIT_ACTIVE_Sold_count_norm  \\\n",
       "SK_ID_CURR                                                            \n",
       "100001                             0                            0.0   \n",
       "100002                             0                            0.0   \n",
       "100003                             0                            0.0   \n",
       "100004                             0                            0.0   \n",
       "100005                             0                            0.0   \n",
       "\n",
       "            CREDIT_CURRENCY_currency 1_count  \\\n",
       "SK_ID_CURR                                     \n",
       "100001                                     7   \n",
       "100002                                     8   \n",
       "100003                                     4   \n",
       "100004                                     2   \n",
       "100005                                     3   \n",
       "\n",
       "            CREDIT_CURRENCY_currency 1_count_norm  \\\n",
       "SK_ID_CURR                                          \n",
       "100001                                        1.0   \n",
       "100002                                        1.0   \n",
       "100003                                        1.0   \n",
       "100004                                        1.0   \n",
       "100005                                        1.0   \n",
       "\n",
       "                               ...                       \\\n",
       "SK_ID_CURR                     ...                        \n",
       "100001                         ...                        \n",
       "100002                         ...                        \n",
       "100003                         ...                        \n",
       "100004                         ...                        \n",
       "100005                         ...                        \n",
       "\n",
       "            CREDIT_TYPE_Microloan_count  CREDIT_TYPE_Microloan_count_norm  \\\n",
       "SK_ID_CURR                                                                  \n",
       "100001                                0                               0.0   \n",
       "100002                                0                               0.0   \n",
       "100003                                0                               0.0   \n",
       "100004                                0                               0.0   \n",
       "100005                                0                               0.0   \n",
       "\n",
       "            CREDIT_TYPE_Mobile operator loan_count  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                           0   \n",
       "100002                                           0   \n",
       "100003                                           0   \n",
       "100004                                           0   \n",
       "100005                                           0   \n",
       "\n",
       "            CREDIT_TYPE_Mobile operator loan_count_norm  \\\n",
       "SK_ID_CURR                                                \n",
       "100001                                              0.0   \n",
       "100002                                              0.0   \n",
       "100003                                              0.0   \n",
       "100004                                              0.0   \n",
       "100005                                              0.0   \n",
       "\n",
       "            CREDIT_TYPE_Mortgage_count  CREDIT_TYPE_Mortgage_count_norm  \\\n",
       "SK_ID_CURR                                                                \n",
       "100001                               0                              0.0   \n",
       "100002                               0                              0.0   \n",
       "100003                               0                              0.0   \n",
       "100004                               0                              0.0   \n",
       "100005                               0                              0.0   \n",
       "\n",
       "            CREDIT_TYPE_Real estate loan_count  \\\n",
       "SK_ID_CURR                                       \n",
       "100001                                       0   \n",
       "100002                                       0   \n",
       "100003                                       0   \n",
       "100004                                       0   \n",
       "100005                                       0   \n",
       "\n",
       "            CREDIT_TYPE_Real estate loan_count_norm  \\\n",
       "SK_ID_CURR                                            \n",
       "100001                                          0.0   \n",
       "100002                                          0.0   \n",
       "100003                                          0.0   \n",
       "100004                                          0.0   \n",
       "100005                                          0.0   \n",
       "\n",
       "            CREDIT_TYPE_Unknown type of loan_count  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                           0   \n",
       "100002                                           0   \n",
       "100003                                           0   \n",
       "100004                                           0   \n",
       "100005                                           0   \n",
       "\n",
       "            CREDIT_TYPE_Unknown type of loan_count_norm  \n",
       "SK_ID_CURR                                               \n",
       "100001                                              0.0  \n",
       "100002                                              0.0  \n",
       "100003                                              0.0  \n",
       "100004                                              0.0  \n",
       "100005                                              0.0  \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "group_var = 'SK_ID_CURR'\n",
    "\n",
    "# 新建的列名\n",
    "columns = []\n",
    "\n",
    "# 迭代变量名\n",
    "for var in categorical_grouped.columns.levels[0]:\n",
    "    # 忽略分组变量\n",
    "    if var != group_var:\n",
    "        # 迭代统计量名称sum、mean\n",
    "        for stat in ['count', 'count_norm']:\n",
    "            columns.append('%s_%s' % (var, stat))\n",
    "\n",
    "# 重命名列\n",
    "categorical_grouped.columns = columns\n",
    "\n",
    "categorical_grouped.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "'sum'列记录了客户总数，'mean'列记录了归一化后的值\n",
    "\n",
    "我们可以将该数据合并到训练数据中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>TARGET</th>\n",
       "      <th>NAME_CONTRACT_TYPE</th>\n",
       "      <th>CODE_GENDER</th>\n",
       "      <th>FLAG_OWN_CAR</th>\n",
       "      <th>FLAG_OWN_REALTY</th>\n",
       "      <th>CNT_CHILDREN</th>\n",
       "      <th>AMT_INCOME_TOTAL</th>\n",
       "      <th>AMT_CREDIT</th>\n",
       "      <th>AMT_ANNUITY</th>\n",
       "      <th>...</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count_norm</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100002</td>\n",
       "      <td>1</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>202500.0</td>\n",
       "      <td>406597.5</td>\n",
       "      <td>24700.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100003</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>N</td>\n",
       "      <td>0</td>\n",
       "      <td>270000.0</td>\n",
       "      <td>1293502.5</td>\n",
       "      <td>35698.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100004</td>\n",
       "      <td>0</td>\n",
       "      <td>Revolving loans</td>\n",
       "      <td>M</td>\n",
       "      <td>Y</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>67500.0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>6750.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100006</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>F</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>135000.0</td>\n",
       "      <td>312682.5</td>\n",
       "      <td>29686.5</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100007</td>\n",
       "      <td>0</td>\n",
       "      <td>Cash loans</td>\n",
       "      <td>M</td>\n",
       "      <td>N</td>\n",
       "      <td>Y</td>\n",
       "      <td>0</td>\n",
       "      <td>121500.0</td>\n",
       "      <td>513000.0</td>\n",
       "      <td>21865.5</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 229 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  TARGET NAME_CONTRACT_TYPE CODE_GENDER FLAG_OWN_CAR  \\\n",
       "0      100002       1         Cash loans           M            N   \n",
       "1      100003       0         Cash loans           F            N   \n",
       "2      100004       0    Revolving loans           M            Y   \n",
       "3      100006       0         Cash loans           F            N   \n",
       "4      100007       0         Cash loans           M            N   \n",
       "\n",
       "  FLAG_OWN_REALTY  CNT_CHILDREN  AMT_INCOME_TOTAL  AMT_CREDIT  AMT_ANNUITY  \\\n",
       "0               Y             0          202500.0    406597.5      24700.5   \n",
       "1               N             0          270000.0   1293502.5      35698.5   \n",
       "2               Y             0           67500.0    135000.0       6750.0   \n",
       "3               Y             0          135000.0    312682.5      29686.5   \n",
       "4               Y             0          121500.0    513000.0      21865.5   \n",
       "\n",
       "                      ...                       CREDIT_TYPE_Microloan_count  \\\n",
       "0                     ...                                               0.0   \n",
       "1                     ...                                               0.0   \n",
       "2                     ...                                               0.0   \n",
       "3                     ...                                               NaN   \n",
       "4                     ...                                               0.0   \n",
       "\n",
       "  CREDIT_TYPE_Microloan_count_norm CREDIT_TYPE_Mobile operator loan_count  \\\n",
       "0                              0.0                                    0.0   \n",
       "1                              0.0                                    0.0   \n",
       "2                              0.0                                    0.0   \n",
       "3                              NaN                                    NaN   \n",
       "4                              0.0                                    0.0   \n",
       "\n",
       "  CREDIT_TYPE_Mobile operator loan_count_norm CREDIT_TYPE_Mortgage_count  \\\n",
       "0                                         0.0                        0.0   \n",
       "1                                         0.0                        0.0   \n",
       "2                                         0.0                        0.0   \n",
       "3                                         NaN                        NaN   \n",
       "4                                         0.0                        0.0   \n",
       "\n",
       "  CREDIT_TYPE_Mortgage_count_norm  CREDIT_TYPE_Real estate loan_count  \\\n",
       "0                             0.0                                 0.0   \n",
       "1                             0.0                                 0.0   \n",
       "2                             0.0                                 0.0   \n",
       "3                             NaN                                 NaN   \n",
       "4                             0.0                                 0.0   \n",
       "\n",
       "   CREDIT_TYPE_Real estate loan_count_norm  \\\n",
       "0                                      0.0   \n",
       "1                                      0.0   \n",
       "2                                      0.0   \n",
       "3                                      NaN   \n",
       "4                                      0.0   \n",
       "\n",
       "   CREDIT_TYPE_Unknown type of loan_count  \\\n",
       "0                                     0.0   \n",
       "1                                     0.0   \n",
       "2                                     0.0   \n",
       "3                                     NaN   \n",
       "4                                     0.0   \n",
       "\n",
       "   CREDIT_TYPE_Unknown type of loan_count_norm  \n",
       "0                                          0.0  \n",
       "1                                          0.0  \n",
       "2                                          0.0  \n",
       "3                                          NaN  \n",
       "4                                          0.0  \n",
       "\n",
       "[5 rows x 229 columns]"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = train.merge(categorical_grouped, left_on = 'SK_ID_CURR', right_index  =True, how = 'left')\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(307511, 229)"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bureau_DAYS_CREDIT_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_sum</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_count</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_mean</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_max</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_min</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_sum</th>\n",
       "      <th>...</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count</th>\n",
       "      <th>CREDIT_TYPE_Microloan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count</th>\n",
       "      <th>CREDIT_TYPE_Mobile operator loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count</th>\n",
       "      <th>CREDIT_TYPE_Mortgage_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count</th>\n",
       "      <th>CREDIT_TYPE_Real estate loan_count_norm</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count</th>\n",
       "      <th>CREDIT_TYPE_Unknown type of loan_count_norm</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>8.0</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103.0</td>\n",
       "      <td>-1437.0</td>\n",
       "      <td>-6992.0</td>\n",
       "      <td>8.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>4.0</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606.0</td>\n",
       "      <td>-2586.0</td>\n",
       "      <td>-5603.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408.0</td>\n",
       "      <td>-1326.0</td>\n",
       "      <td>-1734.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>-1149.000000</td>\n",
       "      <td>-1149.0</td>\n",
       "      <td>-1149.0</td>\n",
       "      <td>-1149.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>3.0</td>\n",
       "      <td>-757.333333</td>\n",
       "      <td>-78.0</td>\n",
       "      <td>-1097.0</td>\n",
       "      <td>-2272.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>18.0</td>\n",
       "      <td>-1271.500000</td>\n",
       "      <td>-239.0</td>\n",
       "      <td>-2882.0</td>\n",
       "      <td>-22887.0</td>\n",
       "      <td>18.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>2.0</td>\n",
       "      <td>-1939.500000</td>\n",
       "      <td>-1138.0</td>\n",
       "      <td>-2741.0</td>\n",
       "      <td>-3879.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>4.0</td>\n",
       "      <td>-1773.000000</td>\n",
       "      <td>-1309.0</td>\n",
       "      <td>-2508.0</td>\n",
       "      <td>-7092.0</td>\n",
       "      <td>4.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>...</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>10 rows × 106 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bureau_DAYS_CREDIT_count  bureau_DAYS_CREDIT_mean  bureau_DAYS_CREDIT_max  \\\n",
       "0                       8.0              -874.000000                  -103.0   \n",
       "1                       4.0             -1400.750000                  -606.0   \n",
       "2                       2.0              -867.000000                  -408.0   \n",
       "3                       NaN                      NaN                     NaN   \n",
       "4                       1.0             -1149.000000                 -1149.0   \n",
       "5                       3.0              -757.333333                   -78.0   \n",
       "6                      18.0             -1271.500000                  -239.0   \n",
       "7                       2.0             -1939.500000                 -1138.0   \n",
       "8                       4.0             -1773.000000                 -1309.0   \n",
       "9                       NaN                      NaN                     NaN   \n",
       "\n",
       "   bureau_DAYS_CREDIT_min  bureau_DAYS_CREDIT_sum  \\\n",
       "0                 -1437.0                 -6992.0   \n",
       "1                 -2586.0                 -5603.0   \n",
       "2                 -1326.0                 -1734.0   \n",
       "3                     NaN                     NaN   \n",
       "4                 -1149.0                 -1149.0   \n",
       "5                 -1097.0                 -2272.0   \n",
       "6                 -2882.0                -22887.0   \n",
       "7                 -2741.0                 -3879.0   \n",
       "8                 -2508.0                 -7092.0   \n",
       "9                     NaN                     NaN   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_count  bureau_CREDIT_DAY_OVERDUE_mean  \\\n",
       "0                              8.0                             0.0   \n",
       "1                              4.0                             0.0   \n",
       "2                              2.0                             0.0   \n",
       "3                              NaN                             NaN   \n",
       "4                              1.0                             0.0   \n",
       "5                              3.0                             0.0   \n",
       "6                             18.0                             0.0   \n",
       "7                              2.0                             0.0   \n",
       "8                              4.0                             0.0   \n",
       "9                              NaN                             NaN   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_max  bureau_CREDIT_DAY_OVERDUE_min  \\\n",
       "0                            0.0                            0.0   \n",
       "1                            0.0                            0.0   \n",
       "2                            0.0                            0.0   \n",
       "3                            NaN                            NaN   \n",
       "4                            0.0                            0.0   \n",
       "5                            0.0                            0.0   \n",
       "6                            0.0                            0.0   \n",
       "7                            0.0                            0.0   \n",
       "8                            0.0                            0.0   \n",
       "9                            NaN                            NaN   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_sum                     ...                       \\\n",
       "0                            0.0                     ...                        \n",
       "1                            0.0                     ...                        \n",
       "2                            0.0                     ...                        \n",
       "3                            NaN                     ...                        \n",
       "4                            0.0                     ...                        \n",
       "5                            0.0                     ...                        \n",
       "6                            0.0                     ...                        \n",
       "7                            0.0                     ...                        \n",
       "8                            0.0                     ...                        \n",
       "9                            NaN                     ...                        \n",
       "\n",
       "   CREDIT_TYPE_Microloan_count  CREDIT_TYPE_Microloan_count_norm  \\\n",
       "0                          0.0                               0.0   \n",
       "1                          0.0                               0.0   \n",
       "2                          0.0                               0.0   \n",
       "3                          NaN                               NaN   \n",
       "4                          0.0                               0.0   \n",
       "5                          0.0                               0.0   \n",
       "6                          0.0                               0.0   \n",
       "7                          0.0                               0.0   \n",
       "8                          0.0                               0.0   \n",
       "9                          NaN                               NaN   \n",
       "\n",
       "   CREDIT_TYPE_Mobile operator loan_count  \\\n",
       "0                                     0.0   \n",
       "1                                     0.0   \n",
       "2                                     0.0   \n",
       "3                                     NaN   \n",
       "4                                     0.0   \n",
       "5                                     0.0   \n",
       "6                                     0.0   \n",
       "7                                     0.0   \n",
       "8                                     0.0   \n",
       "9                                     NaN   \n",
       "\n",
       "   CREDIT_TYPE_Mobile operator loan_count_norm  CREDIT_TYPE_Mortgage_count  \\\n",
       "0                                          0.0                         0.0   \n",
       "1                                          0.0                         0.0   \n",
       "2                                          0.0                         0.0   \n",
       "3                                          NaN                         NaN   \n",
       "4                                          0.0                         0.0   \n",
       "5                                          0.0                         0.0   \n",
       "6                                          0.0                         0.0   \n",
       "7                                          0.0                         0.0   \n",
       "8                                          0.0                         0.0   \n",
       "9                                          NaN                         NaN   \n",
       "\n",
       "   CREDIT_TYPE_Mortgage_count_norm  CREDIT_TYPE_Real estate loan_count  \\\n",
       "0                              0.0                                 0.0   \n",
       "1                              0.0                                 0.0   \n",
       "2                              0.0                                 0.0   \n",
       "3                              NaN                                 NaN   \n",
       "4                              0.0                                 0.0   \n",
       "5                              0.0                                 0.0   \n",
       "6                              0.0                                 0.0   \n",
       "7                              0.0                                 0.0   \n",
       "8                              0.0                                 0.0   \n",
       "9                              NaN                                 NaN   \n",
       "\n",
       "   CREDIT_TYPE_Real estate loan_count_norm  \\\n",
       "0                                      0.0   \n",
       "1                                      0.0   \n",
       "2                                      0.0   \n",
       "3                                      NaN   \n",
       "4                                      0.0   \n",
       "5                                      0.0   \n",
       "6                                      0.0   \n",
       "7                                      0.0   \n",
       "8                                      0.0   \n",
       "9                                      NaN   \n",
       "\n",
       "   CREDIT_TYPE_Unknown type of loan_count  \\\n",
       "0                                     0.0   \n",
       "1                                     0.0   \n",
       "2                                     0.0   \n",
       "3                                     NaN   \n",
       "4                                     0.0   \n",
       "5                                     0.0   \n",
       "6                                     0.0   \n",
       "7                                     0.0   \n",
       "8                                     0.0   \n",
       "9                                     NaN   \n",
       "\n",
       "   CREDIT_TYPE_Unknown type of loan_count_norm  \n",
       "0                                          0.0  \n",
       "1                                          0.0  \n",
       "2                                          0.0  \n",
       "3                                          NaN  \n",
       "4                                          0.0  \n",
       "5                                          0.0  \n",
       "6                                          0.0  \n",
       "7                                          0.0  \n",
       "8                                          0.0  \n",
       "9                                          NaN  \n",
       "\n",
       "[10 rows x 106 columns]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.iloc[:10, 123:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "类别变量处理函数\n",
    "为了使代码更加高效，我们同样对上述方法进行封装，用于处理数据中的类别变量。与agg_numeric函数相同，该函数接受一个数据文件(dataframe)和分组变量(grouping variable)，然后计算数据文件中所有类别变量每个类别的总数和归一化后的数值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def count_categorical(df, group_var, df_name):\n",
    "    \"\"\"计算数据文件中所有类别变量每个类别的总数和归一化后的数值\n",
    "    \n",
    "    参数\n",
    "    --------\n",
    "    df : dataframe \n",
    "        数据文件\n",
    "        \n",
    "    group_var : string\n",
    "        用于将数据文件分组的变量\n",
    "        对于该变量中的每一个值，最终的数据集中都会存在一行\n",
    "        \n",
    "    df_name : string\n",
    "        用于重命名列名的变量\n",
    "\n",
    "    \n",
    "    返回值\n",
    "    --------\n",
    "    categorical : dataframe\n",
    "        A返回一个包含类别变量每个类别的总数和归一化后的数值的数据集(dataframe)\n",
    "        \n",
    "    \"\"\"\n",
    "    \n",
    "    # 选择分类列，并对其做one-hot处理\n",
    "    categorical = pd.get_dummies(df.select_dtypes('object'))\n",
    "    \n",
    "    # 确保为分类列添加标识\n",
    "    categorical[group_var] = df[group_var]\n",
    "    \n",
    "    # 按照分类变量分类，计算总和sum和均值mean\n",
    "    categorical = categorical.groupby(group_var).agg(['sum', 'mean'])\n",
    "    \n",
    "    column_names = []\n",
    "    \n",
    "    # 迭代变量名\n",
    "    for var in categorical.columns.levels[0]:\n",
    "        # 迭代统计量名称sum、mean\n",
    "        for stat in ['count', 'count_norm']:\n",
    "            column_names.append('%s_%s_%s' % (df_name, var, stat))\n",
    "    \n",
    "    categorical.columns = column_names\n",
    "    \n",
    "    return categorical"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Active_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Active_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Bad debt_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Bad debt_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Closed_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Closed_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Sold_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Sold_count_norm</th>\n",
       "      <th>bureau_CREDIT_CURRENCY_currency 1_count</th>\n",
       "      <th>bureau_CREDIT_CURRENCY_currency 1_count_norm</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_CREDIT_TYPE_Microloan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Microloan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mobile operator loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mobile operator loan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mortgage_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mortgage_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Real estate loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Real estate loan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Unknown type of loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Unknown type of loan_count_norm</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100001</th>\n",
       "      <td>3</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.571429</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100002</th>\n",
       "      <td>2</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100003</th>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100004</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100005</th>\n",
       "      <td>2</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            bureau_CREDIT_ACTIVE_Active_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      3   \n",
       "100002                                      2   \n",
       "100003                                      1   \n",
       "100004                                      0   \n",
       "100005                                      2   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Active_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                    0.428571   \n",
       "100002                                    0.250000   \n",
       "100003                                    0.250000   \n",
       "100004                                    0.000000   \n",
       "100005                                    0.666667   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Bad debt_count  \\\n",
       "SK_ID_CURR                                        \n",
       "100001                                        0   \n",
       "100002                                        0   \n",
       "100003                                        0   \n",
       "100004                                        0   \n",
       "100005                                        0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Bad debt_count_norm  \\\n",
       "SK_ID_CURR                                             \n",
       "100001                                           0.0   \n",
       "100002                                           0.0   \n",
       "100003                                           0.0   \n",
       "100004                                           0.0   \n",
       "100005                                           0.0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Closed_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      4   \n",
       "100002                                      6   \n",
       "100003                                      3   \n",
       "100004                                      2   \n",
       "100005                                      1   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Closed_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                    0.571429   \n",
       "100002                                    0.750000   \n",
       "100003                                    0.750000   \n",
       "100004                                    1.000000   \n",
       "100005                                    0.333333   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Sold_count  \\\n",
       "SK_ID_CURR                                    \n",
       "100001                                    0   \n",
       "100002                                    0   \n",
       "100003                                    0   \n",
       "100004                                    0   \n",
       "100005                                    0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Sold_count_norm  \\\n",
       "SK_ID_CURR                                         \n",
       "100001                                       0.0   \n",
       "100002                                       0.0   \n",
       "100003                                       0.0   \n",
       "100004                                       0.0   \n",
       "100005                                       0.0   \n",
       "\n",
       "            bureau_CREDIT_CURRENCY_currency 1_count  \\\n",
       "SK_ID_CURR                                            \n",
       "100001                                            7   \n",
       "100002                                            8   \n",
       "100003                                            4   \n",
       "100004                                            2   \n",
       "100005                                            3   \n",
       "\n",
       "            bureau_CREDIT_CURRENCY_currency 1_count_norm  \\\n",
       "SK_ID_CURR                                                 \n",
       "100001                                               1.0   \n",
       "100002                                               1.0   \n",
       "100003                                               1.0   \n",
       "100004                                               1.0   \n",
       "100005                                               1.0   \n",
       "\n",
       "                                   ...                          \\\n",
       "SK_ID_CURR                         ...                           \n",
       "100001                             ...                           \n",
       "100002                             ...                           \n",
       "100003                             ...                           \n",
       "100004                             ...                           \n",
       "100005                             ...                           \n",
       "\n",
       "            bureau_CREDIT_TYPE_Microloan_count  \\\n",
       "SK_ID_CURR                                       \n",
       "100001                                       0   \n",
       "100002                                       0   \n",
       "100003                                       0   \n",
       "100004                                       0   \n",
       "100005                                       0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Microloan_count_norm  \\\n",
       "SK_ID_CURR                                            \n",
       "100001                                          0.0   \n",
       "100002                                          0.0   \n",
       "100003                                          0.0   \n",
       "100004                                          0.0   \n",
       "100005                                          0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mobile operator loan_count  \\\n",
       "SK_ID_CURR                                                  \n",
       "100001                                                  0   \n",
       "100002                                                  0   \n",
       "100003                                                  0   \n",
       "100004                                                  0   \n",
       "100005                                                  0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mobile operator loan_count_norm  \\\n",
       "SK_ID_CURR                                                       \n",
       "100001                                                    0.0    \n",
       "100002                                                    0.0    \n",
       "100003                                                    0.0    \n",
       "100004                                                    0.0    \n",
       "100005                                                    0.0    \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mortgage_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      0   \n",
       "100002                                      0   \n",
       "100003                                      0   \n",
       "100004                                      0   \n",
       "100005                                      0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mortgage_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                         0.0   \n",
       "100002                                         0.0   \n",
       "100003                                         0.0   \n",
       "100004                                         0.0   \n",
       "100005                                         0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Real estate loan_count  \\\n",
       "SK_ID_CURR                                              \n",
       "100001                                              0   \n",
       "100002                                              0   \n",
       "100003                                              0   \n",
       "100004                                              0   \n",
       "100005                                              0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Real estate loan_count_norm  \\\n",
       "SK_ID_CURR                                                   \n",
       "100001                                                 0.0   \n",
       "100002                                                 0.0   \n",
       "100003                                                 0.0   \n",
       "100004                                                 0.0   \n",
       "100005                                                 0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Unknown type of loan_count  \\\n",
       "SK_ID_CURR                                                  \n",
       "100001                                                  0   \n",
       "100002                                                  0   \n",
       "100003                                                  0   \n",
       "100004                                                  0   \n",
       "100005                                                  0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Unknown type of loan_count_norm  \n",
       "SK_ID_CURR                                                      \n",
       "100001                                                    0.0   \n",
       "100002                                                    0.0   \n",
       "100003                                                    0.0   \n",
       "100004                                                    0.0   \n",
       "100005                                                    0.0   \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_counts = count_categorical(bureau, group_var = 'SK_ID_CURR', df_name = 'bureau')\n",
    "bureau_counts.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 操作bureau_balance数据文件\n",
    "我们现在转向处理bureau balance文件。这个数据文件中包含了每个客户先前向其他金融机构贷款的月度信息。我们首先按SK_ID_BUREAU（先前的‘贷款ID’）对数据文件进行分组，而不是SK_ID_CURR（当前贷款的‘客户ID’）。通过这样的处理，每一条贷款记录都表示为单独的一行。然后我们可以通过SK_ID_CURR进行分组，并计算每个客户的贷款总额。最终处理的结果是生成一个数据集，其中一行表示一个客户及其贷款的相关统计数据\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th>MONTHS_BALANCE</th>\n",
       "      <th>STATUS</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5715448</td>\n",
       "      <td>0</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5715448</td>\n",
       "      <td>-1</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5715448</td>\n",
       "      <td>-2</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5715448</td>\n",
       "      <td>-3</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5715448</td>\n",
       "      <td>-4</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_BUREAU  MONTHS_BALANCE STATUS\n",
       "0       5715448               0      C\n",
       "1       5715448              -1      C\n",
       "2       5715448              -2      C\n",
       "3       5715448              -3      C\n",
       "4       5715448              -4      C"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取bureau_balance数据文件\n",
    "bureau_balance = pd.read_csv('bureau_balance.csv')\n",
    "bureau_balance.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "首先，我们可以计算每个贷款每种状态的数量。幸运的是，我们已经有了这样一个函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bureau_balance_STATUS_0_count</th>\n",
       "      <th>bureau_balance_STATUS_0_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_1_count</th>\n",
       "      <th>bureau_balance_STATUS_1_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_2_count</th>\n",
       "      <th>bureau_balance_STATUS_2_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_3_count</th>\n",
       "      <th>bureau_balance_STATUS_3_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_4_count</th>\n",
       "      <th>bureau_balance_STATUS_4_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_5_count</th>\n",
       "      <th>bureau_balance_STATUS_5_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_C_count</th>\n",
       "      <th>bureau_balance_STATUS_C_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_X_count</th>\n",
       "      <th>bureau_balance_STATUS_X_count_norm</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5001709</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>86</td>\n",
       "      <td>0.886598</td>\n",
       "      <td>11</td>\n",
       "      <td>0.113402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001710</th>\n",
       "      <td>5</td>\n",
       "      <td>0.060241</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>48</td>\n",
       "      <td>0.578313</td>\n",
       "      <td>30</td>\n",
       "      <td>0.361446</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001711</th>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001712</th>\n",
       "      <td>10</td>\n",
       "      <td>0.526316</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.473684</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001713</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>22</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              bureau_balance_STATUS_0_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   5   \n",
       "5001711                                   3   \n",
       "5001712                                  10   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_0_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                 0.000000   \n",
       "5001710                                 0.060241   \n",
       "5001711                                 0.750000   \n",
       "5001712                                 0.526316   \n",
       "5001713                                 0.000000   \n",
       "\n",
       "              bureau_balance_STATUS_1_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_1_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_2_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_2_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_3_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_3_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_4_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_4_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_5_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_5_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_C_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                  86   \n",
       "5001710                                  48   \n",
       "5001711                                   0   \n",
       "5001712                                   9   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_C_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                 0.886598   \n",
       "5001710                                 0.578313   \n",
       "5001711                                 0.000000   \n",
       "5001712                                 0.473684   \n",
       "5001713                                 0.000000   \n",
       "\n",
       "              bureau_balance_STATUS_X_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                  11   \n",
       "5001710                                  30   \n",
       "5001711                                   1   \n",
       "5001712                                   0   \n",
       "5001713                                  22   \n",
       "\n",
       "              bureau_balance_STATUS_X_count_norm  \n",
       "SK_ID_BUREAU                                      \n",
       "5001709                                 0.113402  \n",
       "5001710                                 0.361446  \n",
       "5001711                                 0.250000  \n",
       "5001712                                 0.000000  \n",
       "5001713                                 1.000000  "
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 计算每个贷款每种状态的数量\n",
    "bureau_balance_counts = count_categorical(bureau_balance, group_var = 'SK_ID_BUREAU', df_name = 'bureau_balance')\n",
    "bureau_balance_counts.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在我们可以处理一个数值列。MONTHS_BALANCE列包含着相对于申请日期的'月度余额'，这并不一定是一个重要的数值变量，之后我们会考虑将它看做时间变量，但是现在，我们只能按照数值列对它进行与之前相同的聚合统计"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_count</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_mean</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_max</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_min</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5001709</td>\n",
       "      <td>97</td>\n",
       "      <td>-48.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-96</td>\n",
       "      <td>-4656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5001710</td>\n",
       "      <td>83</td>\n",
       "      <td>-41.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-82</td>\n",
       "      <td>-3403</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5001711</td>\n",
       "      <td>4</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-3</td>\n",
       "      <td>-6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5001712</td>\n",
       "      <td>19</td>\n",
       "      <td>-9.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-18</td>\n",
       "      <td>-171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5001713</td>\n",
       "      <td>22</td>\n",
       "      <td>-10.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-21</td>\n",
       "      <td>-231</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_BUREAU  bureau_balance_MONTHS_BALANCE_count  \\\n",
       "0       5001709                                   97   \n",
       "1       5001710                                   83   \n",
       "2       5001711                                    4   \n",
       "3       5001712                                   19   \n",
       "4       5001713                                   22   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_mean  bureau_balance_MONTHS_BALANCE_max  \\\n",
       "0                               -48.0                                  0   \n",
       "1                               -41.0                                  0   \n",
       "2                                -1.5                                  0   \n",
       "3                                -9.0                                  0   \n",
       "4                               -10.5                                  0   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_min  bureau_balance_MONTHS_BALANCE_sum  \n",
       "0                                -96                              -4656  \n",
       "1                                -82                              -3403  \n",
       "2                                 -3                                 -6  \n",
       "3                                -18                               -171  \n",
       "4                                -21                               -231  "
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 根据'SK_ID_CURR’进行数值统计\n",
    "bureau_balance_agg = agg_numeric(bureau_balance, group_var = 'SK_ID_BUREAU', df_name = 'bureau_balance')\n",
    "bureau_balance_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的数据对每个贷款都进行了计算。现在需要将这些数据和相应的客户结合在一起。首先将数据文件合并在一起，因为所有变量都是数值的，所以只需按SK_ID_CURR分组，再次聚合统计数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_count</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_mean</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_max</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_min</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_sum</th>\n",
       "      <th>bureau_balance_STATUS_0_count</th>\n",
       "      <th>bureau_balance_STATUS_0_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_1_count</th>\n",
       "      <th>bureau_balance_STATUS_1_count_norm</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_balance_STATUS_3_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_4_count</th>\n",
       "      <th>bureau_balance_STATUS_4_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_5_count</th>\n",
       "      <th>bureau_balance_STATUS_5_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_C_count</th>\n",
       "      <th>bureau_balance_STATUS_C_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_X_count</th>\n",
       "      <th>bureau_balance_STATUS_X_count_norm</th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5001709</td>\n",
       "      <td>97</td>\n",
       "      <td>-48.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-96</td>\n",
       "      <td>-4656</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>86</td>\n",
       "      <td>0.886598</td>\n",
       "      <td>11</td>\n",
       "      <td>0.113402</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5001710</td>\n",
       "      <td>83</td>\n",
       "      <td>-41.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-82</td>\n",
       "      <td>-3403</td>\n",
       "      <td>5</td>\n",
       "      <td>0.060241</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>48</td>\n",
       "      <td>0.578313</td>\n",
       "      <td>30</td>\n",
       "      <td>0.361446</td>\n",
       "      <td>162368.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5001711</td>\n",
       "      <td>4</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-3</td>\n",
       "      <td>-6</td>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>162368.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5001712</td>\n",
       "      <td>19</td>\n",
       "      <td>-9.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-18</td>\n",
       "      <td>-171</td>\n",
       "      <td>10</td>\n",
       "      <td>0.526316</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.473684</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>162368.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5001713</td>\n",
       "      <td>22</td>\n",
       "      <td>-10.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-21</td>\n",
       "      <td>-231</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>22</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>150635.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 23 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_BUREAU  bureau_balance_MONTHS_BALANCE_count  \\\n",
       "0       5001709                                   97   \n",
       "1       5001710                                   83   \n",
       "2       5001711                                    4   \n",
       "3       5001712                                   19   \n",
       "4       5001713                                   22   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_mean  bureau_balance_MONTHS_BALANCE_max  \\\n",
       "0                               -48.0                                  0   \n",
       "1                               -41.0                                  0   \n",
       "2                                -1.5                                  0   \n",
       "3                                -9.0                                  0   \n",
       "4                               -10.5                                  0   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_min  bureau_balance_MONTHS_BALANCE_sum  \\\n",
       "0                                -96                              -4656   \n",
       "1                                -82                              -3403   \n",
       "2                                 -3                                 -6   \n",
       "3                                -18                               -171   \n",
       "4                                -21                               -231   \n",
       "\n",
       "   bureau_balance_STATUS_0_count  bureau_balance_STATUS_0_count_norm  \\\n",
       "0                              0                            0.000000   \n",
       "1                              5                            0.060241   \n",
       "2                              3                            0.750000   \n",
       "3                             10                            0.526316   \n",
       "4                              0                            0.000000   \n",
       "\n",
       "   bureau_balance_STATUS_1_count  bureau_balance_STATUS_1_count_norm  \\\n",
       "0                              0                                 0.0   \n",
       "1                              0                                 0.0   \n",
       "2                              0                                 0.0   \n",
       "3                              0                                 0.0   \n",
       "4                              0                                 0.0   \n",
       "\n",
       "      ...      bureau_balance_STATUS_3_count_norm  \\\n",
       "0     ...                                     0.0   \n",
       "1     ...                                     0.0   \n",
       "2     ...                                     0.0   \n",
       "3     ...                                     0.0   \n",
       "4     ...                                     0.0   \n",
       "\n",
       "   bureau_balance_STATUS_4_count  bureau_balance_STATUS_4_count_norm  \\\n",
       "0                              0                                 0.0   \n",
       "1                              0                                 0.0   \n",
       "2                              0                                 0.0   \n",
       "3                              0                                 0.0   \n",
       "4                              0                                 0.0   \n",
       "\n",
       "   bureau_balance_STATUS_5_count  bureau_balance_STATUS_5_count_norm  \\\n",
       "0                              0                                 0.0   \n",
       "1                              0                                 0.0   \n",
       "2                              0                                 0.0   \n",
       "3                              0                                 0.0   \n",
       "4                              0                                 0.0   \n",
       "\n",
       "   bureau_balance_STATUS_C_count  bureau_balance_STATUS_C_count_norm  \\\n",
       "0                             86                            0.886598   \n",
       "1                             48                            0.578313   \n",
       "2                              0                            0.000000   \n",
       "3                              9                            0.473684   \n",
       "4                              0                            0.000000   \n",
       "\n",
       "   bureau_balance_STATUS_X_count  bureau_balance_STATUS_X_count_norm  \\\n",
       "0                             11                            0.113402   \n",
       "1                             30                            0.361446   \n",
       "2                              1                            0.250000   \n",
       "3                              0                            0.000000   \n",
       "4                             22                            1.000000   \n",
       "\n",
       "   SK_ID_CURR  \n",
       "0         NaN  \n",
       "1    162368.0  \n",
       "2    162368.0  \n",
       "3    162368.0  \n",
       "4    150635.0  \n",
       "\n",
       "[5 rows x 23 columns]"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 按照贷款将数据文件分组\n",
    "bureau_by_loan = bureau_balance_agg.merge(bureau_balance_counts, right_index = True, left_on = 'SK_ID_BUREAU', how = 'outer')\n",
    "\n",
    "# 合并（包括SK_ID_CURR）\n",
    "bureau_by_loan = bureau_by_loan.merge(bureau[['SK_ID_BUREAU', 'SK_ID_CURR']], on = 'SK_ID_BUREAU', how = 'left')\n",
    "# how = left 只保留左表的所有数据，如果右表的SK_ID_BUREAU列中出现了左表中没有的值，那么该值所对应的行数据会被舍弃(right同理)\n",
    "bureau_by_loan.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_count</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_mean</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_max</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_min</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_sum</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_mean_count</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_mean_mean</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_mean_max</th>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_mean_min</th>\n",
       "      <th>...</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_count</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_mean</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_max</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_min</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_sum</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_norm_count</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_norm_mean</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_norm_max</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_norm_min</th>\n",
       "      <th>client_bureau_balance_STATUS_X_count_norm_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001.0</td>\n",
       "      <td>7</td>\n",
       "      <td>24.571429</td>\n",
       "      <td>52</td>\n",
       "      <td>2</td>\n",
       "      <td>172</td>\n",
       "      <td>7</td>\n",
       "      <td>-11.785714</td>\n",
       "      <td>-0.5</td>\n",
       "      <td>-25.5</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>4.285714</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>30.0</td>\n",
       "      <td>7</td>\n",
       "      <td>0.214590</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.502129</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002.0</td>\n",
       "      <td>8</td>\n",
       "      <td>13.750000</td>\n",
       "      <td>22</td>\n",
       "      <td>4</td>\n",
       "      <td>110</td>\n",
       "      <td>8</td>\n",
       "      <td>-21.875000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>-39.5</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>1.875000</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "      <td>15.0</td>\n",
       "      <td>8</td>\n",
       "      <td>0.161932</td>\n",
       "      <td>0.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.295455</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100005.0</td>\n",
       "      <td>3</td>\n",
       "      <td>7.000000</td>\n",
       "      <td>13</td>\n",
       "      <td>3</td>\n",
       "      <td>21</td>\n",
       "      <td>3</td>\n",
       "      <td>-3.000000</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>-6.0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.136752</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.410256</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100010.0</td>\n",
       "      <td>2</td>\n",
       "      <td>36.000000</td>\n",
       "      <td>36</td>\n",
       "      <td>36</td>\n",
       "      <td>72</td>\n",
       "      <td>2</td>\n",
       "      <td>-46.000000</td>\n",
       "      <td>-19.5</td>\n",
       "      <td>-72.5</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100013.0</td>\n",
       "      <td>4</td>\n",
       "      <td>57.500000</td>\n",
       "      <td>69</td>\n",
       "      <td>40</td>\n",
       "      <td>230</td>\n",
       "      <td>4</td>\n",
       "      <td>-28.250000</td>\n",
       "      <td>-19.5</td>\n",
       "      <td>-34.0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>10.250000</td>\n",
       "      <td>40</td>\n",
       "      <td>0</td>\n",
       "      <td>41.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.254545</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1.018182</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 106 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  client_bureau_balance_MONTHS_BALANCE_count_count  \\\n",
       "0    100001.0                                                 7   \n",
       "1    100002.0                                                 8   \n",
       "2    100005.0                                                 3   \n",
       "3    100010.0                                                 2   \n",
       "4    100013.0                                                 4   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_count_mean  \\\n",
       "0                                        24.571429   \n",
       "1                                        13.750000   \n",
       "2                                         7.000000   \n",
       "3                                        36.000000   \n",
       "4                                        57.500000   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_count_max  \\\n",
       "0                                              52   \n",
       "1                                              22   \n",
       "2                                              13   \n",
       "3                                              36   \n",
       "4                                              69   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_count_min  \\\n",
       "0                                               2   \n",
       "1                                               4   \n",
       "2                                               3   \n",
       "3                                              36   \n",
       "4                                              40   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_count_sum  \\\n",
       "0                                             172   \n",
       "1                                             110   \n",
       "2                                              21   \n",
       "3                                              72   \n",
       "4                                             230   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_mean_count  \\\n",
       "0                                                7   \n",
       "1                                                8   \n",
       "2                                                3   \n",
       "3                                                2   \n",
       "4                                                4   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_mean_mean  \\\n",
       "0                                      -11.785714   \n",
       "1                                      -21.875000   \n",
       "2                                       -3.000000   \n",
       "3                                      -46.000000   \n",
       "4                                      -28.250000   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_mean_max  \\\n",
       "0                                           -0.5   \n",
       "1                                           -1.5   \n",
       "2                                           -1.0   \n",
       "3                                          -19.5   \n",
       "4                                          -19.5   \n",
       "\n",
       "   client_bureau_balance_MONTHS_BALANCE_mean_min  \\\n",
       "0                                          -25.5   \n",
       "1                                          -39.5   \n",
       "2                                           -6.0   \n",
       "3                                          -72.5   \n",
       "4                                          -34.0   \n",
       "\n",
       "                       ...                        \\\n",
       "0                      ...                         \n",
       "1                      ...                         \n",
       "2                      ...                         \n",
       "3                      ...                         \n",
       "4                      ...                         \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_count  \\\n",
       "0                                           7   \n",
       "1                                           8   \n",
       "2                                           3   \n",
       "3                                           2   \n",
       "4                                           4   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_mean  \\\n",
       "0                                   4.285714   \n",
       "1                                   1.875000   \n",
       "2                                   0.666667   \n",
       "3                                   0.000000   \n",
       "4                                  10.250000   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_max  \\\n",
       "0                                         9   \n",
       "1                                         3   \n",
       "2                                         1   \n",
       "3                                         0   \n",
       "4                                        40   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_min  \\\n",
       "0                                         0   \n",
       "1                                         0   \n",
       "2                                         0   \n",
       "3                                         0   \n",
       "4                                         0   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_sum  \\\n",
       "0                                      30.0   \n",
       "1                                      15.0   \n",
       "2                                       2.0   \n",
       "3                                       0.0   \n",
       "4                                      41.0   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_norm_count  \\\n",
       "0                                                7   \n",
       "1                                                8   \n",
       "2                                                3   \n",
       "3                                                2   \n",
       "4                                                4   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_norm_mean  \\\n",
       "0                                        0.214590   \n",
       "1                                        0.161932   \n",
       "2                                        0.136752   \n",
       "3                                        0.000000   \n",
       "4                                        0.254545   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_norm_max  \\\n",
       "0                                       0.500000   \n",
       "1                                       0.500000   \n",
       "2                                       0.333333   \n",
       "3                                       0.000000   \n",
       "4                                       1.000000   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_norm_min  \\\n",
       "0                                            0.0   \n",
       "1                                            0.0   \n",
       "2                                            0.0   \n",
       "3                                            0.0   \n",
       "4                                            0.0   \n",
       "\n",
       "   client_bureau_balance_STATUS_X_count_norm_sum  \n",
       "0                                       1.502129  \n",
       "1                                       1.295455  \n",
       "2                                       0.410256  \n",
       "3                                       0.000000  \n",
       "4                                       1.018182  \n",
       "\n",
       "[5 rows x 106 columns]"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_balance_by_client = agg_numeric(bureau_by_loan.drop(columns = ['SK_ID_BUREAU']), group_var = 'SK_ID_CURR', df_name = 'client')\n",
    "bureau_balance_by_client.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "总而言之，对于bureau_balance数据文件，我们做了以下处理：\n",
    "\n",
    "1、计算分组后贷款数据的相关统计量(各个status的贷款数量)\n",
    "2、对按贷款分类后的每个类别变量(categorical variable)进行相关统计量计算\n",
    "3、合并训练数据和计算得到的贷款统计量\n",
    "4、对数据集按客户id进行分组，再计算数值型数据\n",
    "\n",
    "最终得到的数据，每一行代表一个客户，其中的统计信息是针对该客户所有贷款计算的，并带有月度余额信息\n",
    "\n",
    "一些变量有点混乱，所以需要解释一下：\n",
    "client_bureau_balance_MONTHS_BALANCE_mean_mean：计算MONTHS_BALANCE中每一笔贷款的平均值。然后为每个客户计算其所有贷款中该数值的平均值\n",
    "client_bureau_balance_STATUS_X_count_norm_sum：对每个贷款统计STATUS==X的发生次数，并除以贷款的总STATUS值。然后，为每个客户计算其所有贷款中该数值的总和\n",
    "\n",
    "在我们将所有变量组合到一个数据集之前，先不计算变量的相关系数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 功能集成\n",
    "我们已经准备好从其他金融机构的历史贷款数据和这些贷款的月偿还数据中获取信息，并将这些信息与训练数据集结合。我们重新设置所有变量，然后使用我们所构建的函数来完成该工作，这个过程展示了复用的好处"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "112"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 删除旧对象释放内存\n",
    "import gc\n",
    "gc.enable()\n",
    "del train, bureau, bureau_balance, bureau_agg, bureau_agg_new, bureau_balance_agg, bureau_balance_counts, bureau_by_loan, bureau_balance_by_client, bureau_counts\n",
    "gc.collect()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从所有数据集中读取新的副本\n",
    "train = pd.read_csv('application_train.csv')\n",
    "bureau = pd.read_csv('bureau.csv')\n",
    "bureau_balance = pd.read_csv('bureau_balance.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bureau数据集计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Active_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Active_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Bad debt_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Bad debt_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Closed_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Closed_count_norm</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Sold_count</th>\n",
       "      <th>bureau_CREDIT_ACTIVE_Sold_count_norm</th>\n",
       "      <th>bureau_CREDIT_CURRENCY_currency 1_count</th>\n",
       "      <th>bureau_CREDIT_CURRENCY_currency 1_count_norm</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_CREDIT_TYPE_Microloan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Microloan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mobile operator loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mobile operator loan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mortgage_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Mortgage_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Real estate loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Real estate loan_count_norm</th>\n",
       "      <th>bureau_CREDIT_TYPE_Unknown type of loan_count</th>\n",
       "      <th>bureau_CREDIT_TYPE_Unknown type of loan_count_norm</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>100001</th>\n",
       "      <td>3</td>\n",
       "      <td>0.428571</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>0.571429</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>7</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100002</th>\n",
       "      <td>2</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>6</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>8</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100003</th>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100004</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>100005</th>\n",
       "      <td>2</td>\n",
       "      <td>0.666667</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.333333</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 46 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "            bureau_CREDIT_ACTIVE_Active_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      3   \n",
       "100002                                      2   \n",
       "100003                                      1   \n",
       "100004                                      0   \n",
       "100005                                      2   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Active_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                    0.428571   \n",
       "100002                                    0.250000   \n",
       "100003                                    0.250000   \n",
       "100004                                    0.000000   \n",
       "100005                                    0.666667   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Bad debt_count  \\\n",
       "SK_ID_CURR                                        \n",
       "100001                                        0   \n",
       "100002                                        0   \n",
       "100003                                        0   \n",
       "100004                                        0   \n",
       "100005                                        0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Bad debt_count_norm  \\\n",
       "SK_ID_CURR                                             \n",
       "100001                                           0.0   \n",
       "100002                                           0.0   \n",
       "100003                                           0.0   \n",
       "100004                                           0.0   \n",
       "100005                                           0.0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Closed_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      4   \n",
       "100002                                      6   \n",
       "100003                                      3   \n",
       "100004                                      2   \n",
       "100005                                      1   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Closed_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                    0.571429   \n",
       "100002                                    0.750000   \n",
       "100003                                    0.750000   \n",
       "100004                                    1.000000   \n",
       "100005                                    0.333333   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Sold_count  \\\n",
       "SK_ID_CURR                                    \n",
       "100001                                    0   \n",
       "100002                                    0   \n",
       "100003                                    0   \n",
       "100004                                    0   \n",
       "100005                                    0   \n",
       "\n",
       "            bureau_CREDIT_ACTIVE_Sold_count_norm  \\\n",
       "SK_ID_CURR                                         \n",
       "100001                                       0.0   \n",
       "100002                                       0.0   \n",
       "100003                                       0.0   \n",
       "100004                                       0.0   \n",
       "100005                                       0.0   \n",
       "\n",
       "            bureau_CREDIT_CURRENCY_currency 1_count  \\\n",
       "SK_ID_CURR                                            \n",
       "100001                                            7   \n",
       "100002                                            8   \n",
       "100003                                            4   \n",
       "100004                                            2   \n",
       "100005                                            3   \n",
       "\n",
       "            bureau_CREDIT_CURRENCY_currency 1_count_norm  \\\n",
       "SK_ID_CURR                                                 \n",
       "100001                                               1.0   \n",
       "100002                                               1.0   \n",
       "100003                                               1.0   \n",
       "100004                                               1.0   \n",
       "100005                                               1.0   \n",
       "\n",
       "                                   ...                          \\\n",
       "SK_ID_CURR                         ...                           \n",
       "100001                             ...                           \n",
       "100002                             ...                           \n",
       "100003                             ...                           \n",
       "100004                             ...                           \n",
       "100005                             ...                           \n",
       "\n",
       "            bureau_CREDIT_TYPE_Microloan_count  \\\n",
       "SK_ID_CURR                                       \n",
       "100001                                       0   \n",
       "100002                                       0   \n",
       "100003                                       0   \n",
       "100004                                       0   \n",
       "100005                                       0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Microloan_count_norm  \\\n",
       "SK_ID_CURR                                            \n",
       "100001                                          0.0   \n",
       "100002                                          0.0   \n",
       "100003                                          0.0   \n",
       "100004                                          0.0   \n",
       "100005                                          0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mobile operator loan_count  \\\n",
       "SK_ID_CURR                                                  \n",
       "100001                                                  0   \n",
       "100002                                                  0   \n",
       "100003                                                  0   \n",
       "100004                                                  0   \n",
       "100005                                                  0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mobile operator loan_count_norm  \\\n",
       "SK_ID_CURR                                                       \n",
       "100001                                                    0.0    \n",
       "100002                                                    0.0    \n",
       "100003                                                    0.0    \n",
       "100004                                                    0.0    \n",
       "100005                                                    0.0    \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mortgage_count  \\\n",
       "SK_ID_CURR                                      \n",
       "100001                                      0   \n",
       "100002                                      0   \n",
       "100003                                      0   \n",
       "100004                                      0   \n",
       "100005                                      0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Mortgage_count_norm  \\\n",
       "SK_ID_CURR                                           \n",
       "100001                                         0.0   \n",
       "100002                                         0.0   \n",
       "100003                                         0.0   \n",
       "100004                                         0.0   \n",
       "100005                                         0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Real estate loan_count  \\\n",
       "SK_ID_CURR                                              \n",
       "100001                                              0   \n",
       "100002                                              0   \n",
       "100003                                              0   \n",
       "100004                                              0   \n",
       "100005                                              0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Real estate loan_count_norm  \\\n",
       "SK_ID_CURR                                                   \n",
       "100001                                                 0.0   \n",
       "100002                                                 0.0   \n",
       "100003                                                 0.0   \n",
       "100004                                                 0.0   \n",
       "100005                                                 0.0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Unknown type of loan_count  \\\n",
       "SK_ID_CURR                                                  \n",
       "100001                                                  0   \n",
       "100002                                                  0   \n",
       "100003                                                  0   \n",
       "100004                                                  0   \n",
       "100005                                                  0   \n",
       "\n",
       "            bureau_CREDIT_TYPE_Unknown type of loan_count_norm  \n",
       "SK_ID_CURR                                                      \n",
       "100001                                                    0.0   \n",
       "100002                                                    0.0   \n",
       "100003                                                    0.0   \n",
       "100004                                                    0.0   \n",
       "100005                                                    0.0   \n",
       "\n",
       "[5 rows x 46 columns]"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_counts = count_categorical(bureau, group_var = 'SK_ID_CURR', df_name = 'bureau')\n",
    "bureau_counts.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Bureau数据集聚合（计算mean、max、min、sum等统计量）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_CURR</th>\n",
       "      <th>bureau_DAYS_CREDIT_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_sum</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_count</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_mean</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_max</th>\n",
       "      <th>bureau_CREDIT_DAY_OVERDUE_min</th>\n",
       "      <th>...</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_count</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_max</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_min</th>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_sum</th>\n",
       "      <th>bureau_AMT_ANNUITY_count</th>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <th>bureau_AMT_ANNUITY_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>100001</td>\n",
       "      <td>7</td>\n",
       "      <td>-735.000000</td>\n",
       "      <td>-49</td>\n",
       "      <td>-1572</td>\n",
       "      <td>-5145</td>\n",
       "      <td>7</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>7</td>\n",
       "      <td>-93.142857</td>\n",
       "      <td>-6</td>\n",
       "      <td>-155</td>\n",
       "      <td>-652</td>\n",
       "      <td>7</td>\n",
       "      <td>3545.357143</td>\n",
       "      <td>10822.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>24817.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>100002</td>\n",
       "      <td>8</td>\n",
       "      <td>-874.000000</td>\n",
       "      <td>-103</td>\n",
       "      <td>-1437</td>\n",
       "      <td>-6992</td>\n",
       "      <td>8</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>8</td>\n",
       "      <td>-499.875000</td>\n",
       "      <td>-7</td>\n",
       "      <td>-1185</td>\n",
       "      <td>-3999</td>\n",
       "      <td>7</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>100003</td>\n",
       "      <td>4</td>\n",
       "      <td>-1400.750000</td>\n",
       "      <td>-606</td>\n",
       "      <td>-2586</td>\n",
       "      <td>-5603</td>\n",
       "      <td>4</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>4</td>\n",
       "      <td>-816.000000</td>\n",
       "      <td>-43</td>\n",
       "      <td>-2131</td>\n",
       "      <td>-3264</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>100004</td>\n",
       "      <td>2</td>\n",
       "      <td>-867.000000</td>\n",
       "      <td>-408</td>\n",
       "      <td>-1326</td>\n",
       "      <td>-1734</td>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>2</td>\n",
       "      <td>-532.000000</td>\n",
       "      <td>-382</td>\n",
       "      <td>-682</td>\n",
       "      <td>-1064</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>100005</td>\n",
       "      <td>3</td>\n",
       "      <td>-190.666667</td>\n",
       "      <td>-62</td>\n",
       "      <td>-373</td>\n",
       "      <td>-572</td>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>3</td>\n",
       "      <td>-54.333333</td>\n",
       "      <td>-11</td>\n",
       "      <td>-121</td>\n",
       "      <td>-163</td>\n",
       "      <td>3</td>\n",
       "      <td>1420.500000</td>\n",
       "      <td>4261.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>4261.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 61 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_CURR  bureau_DAYS_CREDIT_count  bureau_DAYS_CREDIT_mean  \\\n",
       "0      100001                         7              -735.000000   \n",
       "1      100002                         8              -874.000000   \n",
       "2      100003                         4             -1400.750000   \n",
       "3      100004                         2              -867.000000   \n",
       "4      100005                         3              -190.666667   \n",
       "\n",
       "   bureau_DAYS_CREDIT_max  bureau_DAYS_CREDIT_min  bureau_DAYS_CREDIT_sum  \\\n",
       "0                     -49                   -1572                   -5145   \n",
       "1                    -103                   -1437                   -6992   \n",
       "2                    -606                   -2586                   -5603   \n",
       "3                    -408                   -1326                   -1734   \n",
       "4                     -62                    -373                    -572   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_count  bureau_CREDIT_DAY_OVERDUE_mean  \\\n",
       "0                                7                             0.0   \n",
       "1                                8                             0.0   \n",
       "2                                4                             0.0   \n",
       "3                                2                             0.0   \n",
       "4                                3                             0.0   \n",
       "\n",
       "   bureau_CREDIT_DAY_OVERDUE_max  bureau_CREDIT_DAY_OVERDUE_min  \\\n",
       "0                              0                              0   \n",
       "1                              0                              0   \n",
       "2                              0                              0   \n",
       "3                              0                              0   \n",
       "4                              0                              0   \n",
       "\n",
       "            ...            bureau_DAYS_CREDIT_UPDATE_count  \\\n",
       "0           ...                                          7   \n",
       "1           ...                                          8   \n",
       "2           ...                                          4   \n",
       "3           ...                                          2   \n",
       "4           ...                                          3   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_mean  bureau_DAYS_CREDIT_UPDATE_max  \\\n",
       "0                      -93.142857                             -6   \n",
       "1                     -499.875000                             -7   \n",
       "2                     -816.000000                            -43   \n",
       "3                     -532.000000                           -382   \n",
       "4                      -54.333333                            -11   \n",
       "\n",
       "   bureau_DAYS_CREDIT_UPDATE_min  bureau_DAYS_CREDIT_UPDATE_sum  \\\n",
       "0                           -155                           -652   \n",
       "1                          -1185                          -3999   \n",
       "2                          -2131                          -3264   \n",
       "3                           -682                          -1064   \n",
       "4                           -121                           -163   \n",
       "\n",
       "   bureau_AMT_ANNUITY_count  bureau_AMT_ANNUITY_mean  bureau_AMT_ANNUITY_max  \\\n",
       "0                         7              3545.357143                 10822.5   \n",
       "1                         7                 0.000000                     0.0   \n",
       "2                         0                      NaN                     NaN   \n",
       "3                         0                      NaN                     NaN   \n",
       "4                         3              1420.500000                  4261.5   \n",
       "\n",
       "   bureau_AMT_ANNUITY_min  bureau_AMT_ANNUITY_sum  \n",
       "0                     0.0                 24817.5  \n",
       "1                     0.0                     0.0  \n",
       "2                     NaN                     0.0  \n",
       "3                     NaN                     0.0  \n",
       "4                     0.0                  4261.5  \n",
       "\n",
       "[5 rows x 61 columns]"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_agg = agg_numeric(bureau.drop(columns = ['SK_ID_BUREAU']), group_var = 'SK_ID_CURR', df_name = 'bureau')\n",
    "bureau_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 按贷款对Bureau Balance数据集计数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bureau_balance_STATUS_0_count</th>\n",
       "      <th>bureau_balance_STATUS_0_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_1_count</th>\n",
       "      <th>bureau_balance_STATUS_1_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_2_count</th>\n",
       "      <th>bureau_balance_STATUS_2_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_3_count</th>\n",
       "      <th>bureau_balance_STATUS_3_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_4_count</th>\n",
       "      <th>bureau_balance_STATUS_4_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_5_count</th>\n",
       "      <th>bureau_balance_STATUS_5_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_C_count</th>\n",
       "      <th>bureau_balance_STATUS_C_count_norm</th>\n",
       "      <th>bureau_balance_STATUS_X_count</th>\n",
       "      <th>bureau_balance_STATUS_X_count_norm</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>5001709</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>86</td>\n",
       "      <td>0.886598</td>\n",
       "      <td>11</td>\n",
       "      <td>0.113402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001710</th>\n",
       "      <td>5</td>\n",
       "      <td>0.060241</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>48</td>\n",
       "      <td>0.578313</td>\n",
       "      <td>30</td>\n",
       "      <td>0.361446</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001711</th>\n",
       "      <td>3</td>\n",
       "      <td>0.750000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.250000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001712</th>\n",
       "      <td>10</td>\n",
       "      <td>0.526316</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>9</td>\n",
       "      <td>0.473684</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5001713</th>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>22</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              bureau_balance_STATUS_0_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   5   \n",
       "5001711                                   3   \n",
       "5001712                                  10   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_0_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                 0.000000   \n",
       "5001710                                 0.060241   \n",
       "5001711                                 0.750000   \n",
       "5001712                                 0.526316   \n",
       "5001713                                 0.000000   \n",
       "\n",
       "              bureau_balance_STATUS_1_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_1_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_2_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_2_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_3_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_3_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_4_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_4_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_5_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                   0   \n",
       "5001710                                   0   \n",
       "5001711                                   0   \n",
       "5001712                                   0   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_5_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                      0.0   \n",
       "5001710                                      0.0   \n",
       "5001711                                      0.0   \n",
       "5001712                                      0.0   \n",
       "5001713                                      0.0   \n",
       "\n",
       "              bureau_balance_STATUS_C_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                  86   \n",
       "5001710                                  48   \n",
       "5001711                                   0   \n",
       "5001712                                   9   \n",
       "5001713                                   0   \n",
       "\n",
       "              bureau_balance_STATUS_C_count_norm  \\\n",
       "SK_ID_BUREAU                                       \n",
       "5001709                                 0.886598   \n",
       "5001710                                 0.578313   \n",
       "5001711                                 0.000000   \n",
       "5001712                                 0.473684   \n",
       "5001713                                 0.000000   \n",
       "\n",
       "              bureau_balance_STATUS_X_count  \\\n",
       "SK_ID_BUREAU                                  \n",
       "5001709                                  11   \n",
       "5001710                                  30   \n",
       "5001711                                   1   \n",
       "5001712                                   0   \n",
       "5001713                                  22   \n",
       "\n",
       "              bureau_balance_STATUS_X_count_norm  \n",
       "SK_ID_BUREAU                                      \n",
       "5001709                                 0.113402  \n",
       "5001710                                 0.361446  \n",
       "5001711                                 0.250000  \n",
       "5001712                                 0.000000  \n",
       "5001713                                 1.000000  "
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_balance_counts = count_categorical(bureau_balance, group_var = 'SK_ID_BUREAU', df_name = 'bureau_balance')\n",
    "bureau_balance_counts.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 按贷款对Bureau Balance数据集聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>SK_ID_BUREAU</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_count</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_mean</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_max</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_min</th>\n",
       "      <th>bureau_balance_MONTHS_BALANCE_sum</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>5001709</td>\n",
       "      <td>97</td>\n",
       "      <td>-48.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-96</td>\n",
       "      <td>-4656</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>5001710</td>\n",
       "      <td>83</td>\n",
       "      <td>-41.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-82</td>\n",
       "      <td>-3403</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5001711</td>\n",
       "      <td>4</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-3</td>\n",
       "      <td>-6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5001712</td>\n",
       "      <td>19</td>\n",
       "      <td>-9.0</td>\n",
       "      <td>0</td>\n",
       "      <td>-18</td>\n",
       "      <td>-171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5001713</td>\n",
       "      <td>22</td>\n",
       "      <td>-10.5</td>\n",
       "      <td>0</td>\n",
       "      <td>-21</td>\n",
       "      <td>-231</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   SK_ID_BUREAU  bureau_balance_MONTHS_BALANCE_count  \\\n",
       "0       5001709                                   97   \n",
       "1       5001710                                   83   \n",
       "2       5001711                                    4   \n",
       "3       5001712                                   19   \n",
       "4       5001713                                   22   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_mean  bureau_balance_MONTHS_BALANCE_max  \\\n",
       "0                               -48.0                                  0   \n",
       "1                               -41.0                                  0   \n",
       "2                                -1.5                                  0   \n",
       "3                                -9.0                                  0   \n",
       "4                               -10.5                                  0   \n",
       "\n",
       "   bureau_balance_MONTHS_BALANCE_min  bureau_balance_MONTHS_BALANCE_sum  \n",
       "0                                -96                              -4656  \n",
       "1                                -82                              -3403  \n",
       "2                                 -3                                 -6  \n",
       "3                                -18                               -171  \n",
       "4                                -21                               -231  "
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bureau_balance_agg = agg_numeric(bureau_balance, group_var = 'SK_ID_BUREAU', df_name = 'bureau_balance')\n",
    "bureau_balance_agg.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 按客户对Bureau Balance数据集聚合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 按贷款对数据集分组\n",
    "bureau_by_loan = bureau_balance_agg.merge(bureau_balance_counts, right_index = True, left_on = 'SK_ID_BUREAU', how = 'outer')\n",
    "\n",
    "# 将SK_ID_CURR结合\n",
    "bureau_by_loan = bureau[['SK_ID_BUREAU', 'SK_ID_CURR']].merge(bureau_by_loan, on = 'SK_ID_BUREAU', how = 'left')\n",
    "\n",
    "# 将每个客户的数据聚合\n",
    "bureau_balance_by_client = agg_numeric(bureau_by_loan.drop(columns = ['SK_ID_BUREAU']), group_var = 'SK_ID_CURR', df_name = 'client')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在训练数据中插入计算处理后的特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Original Number of Feature:  122\n"
     ]
    }
   ],
   "source": [
    "original_features = list(train.columns)\n",
    "print('Original Number of Feature: ', len(original_features))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 结合Bureau数据集计数（这里有些同学可能会报key error，原因在于没有更新pandas。方法： 命令行输入'pip install -U pandas '）\n",
    "train = train.merge(bureau_counts, on = 'SK_ID_CURR', how = 'left')\n",
    "\n",
    "# 结合Bureau数据集\n",
    "train = train.merge(bureau_agg, on = 'SK_ID_CURR', how = 'left')\n",
    "\n",
    "# 按客户对月度信息分组\n",
    "train = train.merge(bureau_balance_by_client, on = 'SK_ID_CURR', how = 'left')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of features using previous loans from other institutions data:  333\n"
     ]
    }
   ],
   "source": [
    "new_features = list(train.columns)\n",
    "print('Number of features using previous loans from other institutions data: ', len(new_features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征工程结果\n",
    "在完成上述所有工作之后，现在我们来看看我们所创建的变量。首先可以查看缺失值的百分比、变量与目标的相关性以及变量与其他变量的相关性。变量之间的相关性可以表明是否有共线变量，即彼此高度相关的变量。通常我们要删除一对共线变量中的一个，因为该变量是多余的。我们还可以使用缺失值的百分比来删除没有表征足够信息的一些特征。特征选择是接下来工作的一个重点，通过减少特征的数量，可以帮助模型在训练期间有效学习，并且还可以更好地对测试数据进行信息概括。“维数灾难”是指由太多特征（太高的维度）引起的问题的名称。随着变量数量的增加，学习这些变量和目标值之间的关系所需的数据量呈指数增长\n",
    "特征选择是删除变量的过程，以帮助我们的模型更好地学习和推广到测试集。目的是去除无用/冗余变量，同时保留有用的变量。有许多工具可用于此过程，但是在本文中，我们将主要删除具有高缺失率和高相关性的变量的列。之后我们可以了解如何使用从诸如梯度增强机或随机森林模型之类的模型中返回的特征来执行特征选择。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 缺失值\n",
    "主要考虑丢弃高缺失率的列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 列缺失值计算函数\n",
    "def missing_values_table(df):\n",
    "    # 总缺失值\n",
    "    mis_val = df.isnull().sum()\n",
    "    \n",
    "    # 缺失值百分比\n",
    "    mis_val_percent = 100 * df.isnull().sum() / len(df)\n",
    "    \n",
    "    # 对结果建表\n",
    "    mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)# concat函数可以将数据根据不同的轴作简单的融合连接\n",
    "    \n",
    "    # 列重命名\n",
    "    mis_val_table_ren_columns = mis_val_table.rename(\n",
    "    columns = {0 : 'Missing Values', 1 : '% of Total Values'})\n",
    "    \n",
    "    # 按缺失率递减排序\n",
    "    mis_val_table_ren_columns = mis_val_table_ren_columns[\n",
    "        mis_val_table_ren_columns.iloc[:, 1] != 0].sort_values(\n",
    "    '% of Total Values', ascending=False).round(1)\n",
    "    \n",
    "    # 输出总信息\n",
    "    print (\"Your selected dataframe has \" + str(df.shape[1]) + \" columns.\\n\"      \n",
    "            \"There are \" + str(mis_val_table_ren_columns.shape[0]) +\n",
    "              \" columns that have missing values.\")  \n",
    "    \n",
    "    # 返回缺失信息\n",
    "    return mis_val_table_ren_columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your selected dataframe has 333 columns.\n",
      "There are 278 columns that have missing values.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Missing Values</th>\n",
       "      <th>% of Total Values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>bureau_AMT_ANNUITY_min</th>\n",
       "      <td>227502</td>\n",
       "      <td>74.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_AMT_ANNUITY_max</th>\n",
       "      <td>227502</td>\n",
       "      <td>74.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_AMT_ANNUITY_mean</th>\n",
       "      <td>227502</td>\n",
       "      <td>74.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_4_count_min</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_3_count_norm_mean</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_count_min</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_4_count_max</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_4_count_mean</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_3_count_norm_min</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_STATUS_3_count_norm_max</th>\n",
       "      <td>215280</td>\n",
       "      <td>70.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                Missing Values  \\\n",
       "bureau_AMT_ANNUITY_min                                  227502   \n",
       "bureau_AMT_ANNUITY_max                                  227502   \n",
       "bureau_AMT_ANNUITY_mean                                 227502   \n",
       "client_bureau_balance_STATUS_4_count_min                215280   \n",
       "client_bureau_balance_STATUS_3_count_norm_mean          215280   \n",
       "client_bureau_balance_MONTHS_BALANCE_count_min          215280   \n",
       "client_bureau_balance_STATUS_4_count_max                215280   \n",
       "client_bureau_balance_STATUS_4_count_mean               215280   \n",
       "client_bureau_balance_STATUS_3_count_norm_min           215280   \n",
       "client_bureau_balance_STATUS_3_count_norm_max           215280   \n",
       "\n",
       "                                                % of Total Values  \n",
       "bureau_AMT_ANNUITY_min                                       74.0  \n",
       "bureau_AMT_ANNUITY_max                                       74.0  \n",
       "bureau_AMT_ANNUITY_mean                                      74.0  \n",
       "client_bureau_balance_STATUS_4_count_min                     70.0  \n",
       "client_bureau_balance_STATUS_3_count_norm_mean               70.0  \n",
       "client_bureau_balance_MONTHS_BALANCE_count_min               70.0  \n",
       "client_bureau_balance_STATUS_4_count_max                     70.0  \n",
       "client_bureau_balance_STATUS_4_count_mean                    70.0  \n",
       "client_bureau_balance_STATUS_3_count_norm_min                70.0  \n",
       "client_bureau_balance_STATUS_3_count_norm_max                70.0  "
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "missing_train = missing_values_table(train)\n",
    "missing_train.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们看到有许多列的缺失值的百分比很高。缺失阈值的选定需要根据问题本身来考虑。这里为了减少特征的数量，我们将删除训练或测试数据中任何大于90%缺失值的列。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "missing_train_vars = list(missing_train.index[missing_train['% of Total Values'] > 90])\n",
    "len(missing_train_vars)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在删除缺失值之前，首先在测试数据中统计缺失值百分比。然后在训练或测试数据中删除超过90%个缺失值的列。现在重新查看测试数据，执行相同的操作，并查看测试数据中的缺失值。我们已经计算了所有的计数和聚合统计数据，因此只需要将测试数据与适当的数据合并"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 计算测试数据信息"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 读取数据\n",
    "test = pd.read_csv('application_test.csv')\n",
    "\n",
    "# 与bureau_counts数据结合\n",
    "test = test.merge(bureau_counts, on = 'SK_ID_CURR', how = 'left')\n",
    "\n",
    "# 与bbureau_agg数据结合\n",
    "test = test.merge(bureau_agg, on = 'SK_ID_CURR', how = 'left')\n",
    "\n",
    "# 与bureau_balance_by_client数据结合\n",
    "test = test.merge(bureau_balance_by_client, on = 'SK_ID_CURR', how = 'left')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Shape of Testing Data:  (48744, 332)\n"
     ]
    }
   ],
   "source": [
    "print('Shape of Testing Data: ', test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们需要对齐测试和训练数据文件，这意味着需要使它们具有完全相同的列。其实本不需要这样做，但是当进行one-hot编码时，我们需要对齐数据集以确保它们具有相同的列。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_labels = train['TARGET']\n",
    "\n",
    "# 通过移除'TARGET'列来对齐列\n",
    "train, test = train.align(test, join = 'inner', axis = 1)\n",
    "\n",
    "train['TARGET'] = train_labels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Data Shape:  (307511, 333)\n",
      "Testing Data Shape:  (48744, 332)\n"
     ]
    }
   ],
   "source": [
    "print('Training Data Shape: ', train.shape)\n",
    "print('Testing Data Shape: ', test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，数据集已经具有相同的列（除了训练数据中的TARGET列），这意味着我们可以在机器学习模型中使用它们，该模型需要在训练和测试数据中看到相同的列\n",
    "\n",
    "现在让我们看看测试数据中缺失值的百分比，从而计算出应该丢弃的列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Your selected dataframe has 332 columns.\n",
      "There are 275 columns that have missing values.\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Missing Values</th>\n",
       "      <th>% of Total Values</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>COMMONAREA_MEDI</th>\n",
       "      <td>33495</td>\n",
       "      <td>68.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>COMMONAREA_MODE</th>\n",
       "      <td>33495</td>\n",
       "      <td>68.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>COMMONAREA_AVG</th>\n",
       "      <td>33495</td>\n",
       "      <td>68.7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NONLIVINGAPARTMENTS_MEDI</th>\n",
       "      <td>33347</td>\n",
       "      <td>68.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NONLIVINGAPARTMENTS_AVG</th>\n",
       "      <td>33347</td>\n",
       "      <td>68.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>NONLIVINGAPARTMENTS_MODE</th>\n",
       "      <td>33347</td>\n",
       "      <td>68.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>FONDKAPREMONT_MODE</th>\n",
       "      <td>32797</td>\n",
       "      <td>67.3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LIVINGAPARTMENTS_MEDI</th>\n",
       "      <td>32780</td>\n",
       "      <td>67.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LIVINGAPARTMENTS_MODE</th>\n",
       "      <td>32780</td>\n",
       "      <td>67.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>LIVINGAPARTMENTS_AVG</th>\n",
       "      <td>32780</td>\n",
       "      <td>67.2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                          Missing Values  % of Total Values\n",
       "COMMONAREA_MEDI                    33495               68.7\n",
       "COMMONAREA_MODE                    33495               68.7\n",
       "COMMONAREA_AVG                     33495               68.7\n",
       "NONLIVINGAPARTMENTS_MEDI           33347               68.4\n",
       "NONLIVINGAPARTMENTS_AVG            33347               68.4\n",
       "NONLIVINGAPARTMENTS_MODE           33347               68.4\n",
       "FONDKAPREMONT_MODE                 32797               67.3\n",
       "LIVINGAPARTMENTS_MEDI              32780               67.2\n",
       "LIVINGAPARTMENTS_MODE              32780               67.2\n",
       "LIVINGAPARTMENTS_AVG               32780               67.2"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "missing_test = missing_values_table(test)\n",
    "missing_test.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "missing_test_vars = list(missing_test.index[missing_test['% of Total Values'] > 90])\n",
    "len(missing_test_vars)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "There are 0 columns with more than 90% missing in either the training or testing data.\n"
     ]
    }
   ],
   "source": [
    "missing_columns = list(set(missing_test_vars + missing_train_vars))\n",
    "print('There are %d columns with more than 90%% missing in either the training or testing data.' % len(missing_columns))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 舍弃缺失率高的列\n",
    "train = train.drop(columns = missing_columns)\n",
    "test = test.drop(columns = missing_columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本轮中没有舍弃任何列，这是由于每一列的缺失率都低于90%，因此我们考虑使用其他的特征选择方法来减少维数\n",
    "\n",
    "此刻我们保存了完整的训练和测试数据。我鼓励大家尝试采用不同的缺失率阈值来删除缺失列并比较结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "train.to_csv('train_bureau_raw.csv', index = False)\n",
    "test.to_csv('test_bureau_raw.csv', index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 相关性\n",
    "首先让我们看看变量与目标的相关性。可以从我们创建的任何变量中看到，与训练数据中原有的变量相比，它们具有更大的相关性。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算数据集的相关系数\n",
    "corrs = train.corr()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>TARGET</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>TARGET</th>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_DAYS_CREDIT_mean</th>\n",
       "      <td>0.089729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_min_mean</th>\n",
       "      <td>0.089038</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DAYS_BIRTH</th>\n",
       "      <td>0.078239</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_CREDIT_ACTIVE_Active_count_norm</th>\n",
       "      <td>0.077356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_mean_mean</th>\n",
       "      <td>0.076424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_DAYS_CREDIT_min</th>\n",
       "      <td>0.075248</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_min_min</th>\n",
       "      <td>0.073225</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>client_bureau_balance_MONTHS_BALANCE_sum_mean</th>\n",
       "      <td>0.072606</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>bureau_DAYS_CREDIT_UPDATE_mean</th>\n",
       "      <td>0.068927</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                  TARGET\n",
       "TARGET                                          1.000000\n",
       "bureau_DAYS_CREDIT_mean                         0.089729\n",
       "client_bureau_balance_MONTHS_BALANCE_min_mean   0.089038\n",
       "DAYS_BIRTH                                      0.078239\n",
       "bureau_CREDIT_ACTIVE_Active_count_norm          0.077356\n",
       "client_bureau_balance_MONTHS_BALANCE_mean_mean  0.076424\n",
       "bureau_DAYS_CREDIT_min                          0.075248\n",
       "client_bureau_balance_MONTHS_BALANCE_min_min    0.073225\n",
       "client_bureau_balance_MONTHS_BALANCE_sum_mean   0.072606\n",
       "bureau_DAYS_CREDIT_UPDATE_mean                  0.068927"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "corrs = corrs.sort_values('TARGET', ascending = False)\n",
    "\n",
    "# 相关性最强的10个属性\n",
    "pd.DataFrame(corrs['TARGET'].head(10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与TARGET相关度最高的变量（除了TARGET本身）是我们创建的变量。然而变量具有高相关性并不意味着它一定是有用的，需要注意的是，如果我们生成了上百个新变量，其中一些变量的相关性可能仅仅是由于随机噪声而产生的\n",
    "\n",
    "从怀疑的角度看待相关系数，确实存在有些新创建变量会产生巨大作用。为了评估变量的‘有用性’，我们将查看模型返回的特征重要性。出于好奇（并且因为我们已经编写了函数），所以可以对新创建的变量中的两个进行KDE图展示"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "'client_bureau_balance_counts_mean'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   3077\u001b[0m             \u001b[1;32mtry\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3078\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3079\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'client_bureau_balance_counts_mean'",
      "\nDuring handling of the above exception, another exception occurred:\n",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-61-6f202daac68a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mkde_target\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mvar_name\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'client_bureau_balance_counts_mean'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtrain\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;32m<ipython-input-8-10a018c6e757>\u001b[0m in \u001b[0;36mkde_target\u001b[1;34m(var_name, df)\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      4\u001b[0m     \u001b[1;31m# 计算变量与目标值之间的皮尔森相关系数\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 5\u001b[1;33m     \u001b[0mcorr\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'TARGET'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcorr\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mvar_name\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m     \u001b[1;31m# 计算偿还或未偿还贷款数据的中位数\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   2686\u001b[0m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2687\u001b[0m         \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2688\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2689\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2690\u001b[0m     \u001b[1;32mdef\u001b[0m \u001b[0m_getitem_column\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\frame.py\u001b[0m in \u001b[0;36m_getitem_column\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m   2693\u001b[0m         \u001b[1;31m# get column\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2694\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mis_unique\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2695\u001b[1;33m             \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_get_item_cache\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2696\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2697\u001b[0m         \u001b[1;31m# duplicate columns & possible reduce dimensionality\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36m_get_item_cache\u001b[1;34m(self, item)\u001b[0m\n\u001b[0;32m   2487\u001b[0m         \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcache\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2488\u001b[0m         \u001b[1;32mif\u001b[0m \u001b[0mres\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2489\u001b[1;33m             \u001b[0mvalues\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_data\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   2490\u001b[0m             \u001b[0mres\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_box_item_values\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mvalues\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   2491\u001b[0m             \u001b[0mcache\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mres\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\internals.py\u001b[0m in \u001b[0;36mget\u001b[1;34m(self, item, fastpath)\u001b[0m\n\u001b[0;32m   4113\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   4114\u001b[0m             \u001b[1;32mif\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 4115\u001b[1;33m                 \u001b[0mloc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mitem\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   4116\u001b[0m             \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   4117\u001b[0m                 \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0marange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0misna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mD:\\anaconda3\\lib\\site-packages\\pandas\\core\\indexes\\base.py\u001b[0m in \u001b[0;36mget_loc\u001b[1;34m(self, key, method, tolerance)\u001b[0m\n\u001b[0;32m   3078\u001b[0m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3079\u001b[0m             \u001b[1;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3080\u001b[1;33m                 \u001b[1;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_maybe_cast_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m   3081\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m   3082\u001b[0m         \u001b[0mindexer\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_indexer\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmethod\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mtolerance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtolerance\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;32mpandas\\_libs\\hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[1;34m()\u001b[0m\n",
      "\u001b[1;31mKeyError\u001b[0m: 'client_bureau_balance_counts_mean'"
     ]
    }
   ],
   "source": [
    "kde_target(var_name='client_bureau_balance_counts_mean', df=train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这个变量代表每个客户每月贷款的平均记录数。例如，如果一个客户以前有三笔贷款，月度数据中的记录数为3、4和5，那么平均记录数的值为4。根据分布，每个贷款的平均月度记录较多的客户更有可能用住房信贷偿还贷款。我们不要过多地研究这个值，但是它可能表明，信用历史更早的客户通常更有可能偿还贷款。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "kde_target(var_name='bureau_CREDIT_ACTIVE_active_counts_norm', df=train)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从分布图可以看出，该变量分布于各个地方。该变量表示以前的贷款的贷款中，'CREADIT_ACTIVE'值为active的数量除以客户以前的贷款总数。这里的相关性太弱了，我认为我们不应该得出任何结论"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 共线变量\n",
    "我们不仅可以计算变量与目标的相关性，还可以计算每个变量与其他变量的相关性。这将允许我们看看是否存在高度共线变量，这些变量可能应该从数据中删除。\n",
    "\n",
    "让我们寻找任何与0.8个变量相关的变量。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 设置阈值\n",
    "threshold = 0.8\n",
    "\n",
    "# 保存相关变量的空字典\n",
    "above_threshold_vars = {}\n",
    "\n",
    "# 对于每一列,记录大于阈值的变量\n",
    "for col in corrs:\n",
    "    above_threshold_vars[col] = list(corrs.index[corrs[col] > threshold])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于每一对具有高相关性的变量，我们需要去掉其中的一个变量。下面的代码仅通过添加每对共线变量中的其中之一来创建一个变量集合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Number of columns to remove:  134\n"
     ]
    }
   ],
   "source": [
    "# 记录需要移除的列和已经检查过的列\n",
    "cols_to_remove = []\n",
    "cols_seen = []\n",
    "cols_to_remove_pair = []\n",
    "\n",
    "# 迭代列及相关列\n",
    "for key, value in above_threshold_vars.items():\n",
    "    # 查找已经检查过的列\n",
    "    cols_seen.append(key)\n",
    "    for x in value:\n",
    "        if x == key:\n",
    "            next\n",
    "        else:\n",
    "            # 移除一对高相关性变量中的一个\n",
    "            if x not in cols_seen:\n",
    "                cols_to_remove.append(x)\n",
    "                cols_to_remove_pair.append(key)\n",
    "            \n",
    "cols_to_remove = list(set(cols_to_remove))\n",
    "print('Number of columns to remove: ', len(cols_to_remove))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以从训练和测试数据集中删除这些列。在删除这些变量之后，我们必须比较删除前后的性能差别"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Corrs Removed Shape:  (307511, 199)\n",
      "Testing Corrs Removed Shape:  (48744, 198)\n"
     ]
    }
   ],
   "source": [
    "train_corrs_removed = train.drop(columns = cols_to_remove)\n",
    "test_corrs_removed = test.drop(columns = cols_to_remove)\n",
    "\n",
    "print('Training Corrs Removed Shape: ', train_corrs_removed.shape)\n",
    "print('Testing Corrs Removed Shape: ', test_corrs_removed.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_corrs_removed.to_csv('train_bureau_corrs_removed.csv', index = False)\n",
    "test_corrs_removed.to_csv('test_bureau_corrs_removed.csv', index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建模\n",
    "为了实际测试这些新数据集的性能，我们将尝试使用它们来进行机器学习！这里，我们将使用我在另一篇笔记中开发的函数来比较这些特性（原始版本和删除的高度相关的变量）。我已经记录了相关效果，下面列出模型控件及两个测试条件：\n",
    "\n",
    "对于所有数据集，使用下面所示的模型（用精确的超参数）\n",
    "\n",
    "控件：基础数据\n",
    "测试一：基础数据 + bureau和bureau_balance文件中所有的数据记录的所有数据\n",
    "测试二：基础数据 + bureau和bureau_balance文件中所有的数据记录的高相关性数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "import lightgbm as lgb\n",
    "\n",
    "from sklearn.model_selection import KFold\n",
    "from sklearn.metrics import roc_auc_score\n",
    "from sklearn.preprocessing import LabelEncoder\n",
    "\n",
    "import gc\n",
    "\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "def model(features, test_features, encoding = 'ohe', n_folds = 5):\n",
    "    \n",
    "    \"\"\"使用基于交叉验证的LightGBM进行训练和测试\n",
    "    \n",
    "    参数\n",
    "    --------\n",
    "        features (pd.DataFrame): \n",
    "            用于模型训练的训练数据集，其必须包含'TARGET'列\n",
    "        test_features (pd.DataFrame): \n",
    "            用于模型预测的测试数据集 \n",
    "        encoding (str, default = 'ohe'): \n",
    "            指定类别变量的编码方式。'oho'：使用one-hot编码。'le'：使用整型标签编码\n",
    "        n_folds (int, default = 5): \n",
    "            用于交叉检验的折数，默认采用5折交叉检验\n",
    "        \n",
    "    返回值\n",
    "    --------\n",
    "        submission (pd.DataFrame): \n",
    "            包含`SK_ID_CURR`和`TARGET`属性的预测数据\n",
    "        feature_importances (pd.DataFrame): \n",
    "            该模型的重要特征\n",
    "        valid_metrics (pd.DataFrame): \n",
    "            ROC、AUC等误差统计量（包含训练/测试过程）        \n",
    "    \"\"\"\n",
    "    \n",
    "    # 抽取id\n",
    "    train_ids = features['SK_ID_CURR']\n",
    "    test_ids = test_features['SK_ID_CURR']\n",
    "    \n",
    "    # 抽取标签\n",
    "    labels = features['TARGET']\n",
    "    \n",
    "    # 移除id和标签\n",
    "    features = features.drop(columns = ['SK_ID_CURR', 'TARGET'])\n",
    "    test_features = test_features.drop(columns = ['SK_ID_CURR'])\n",
    "    \n",
    "    \n",
    "    # One-Hot编码\n",
    "    if encoding == 'ohe':\n",
    "        features = pd.get_dummies(features)\n",
    "        test_features = pd.get_dummies(test_features)\n",
    "        \n",
    "        # 通过列对齐数据帧\n",
    "        features, test_features = features.align(test_features, join = 'inner', axis = 1)\n",
    "        \n",
    "        # No categorical indices to record\n",
    "        cat_indices = 'auto'\n",
    "    \n",
    "    # 整型标签编码\n",
    "    elif encoding == 'le':\n",
    "        \n",
    "        # 创建标签编码器(LabelEncoder)\n",
    "        label_encoder = LabelEncoder()\n",
    "        \n",
    "        # 存储分类索引的列表\n",
    "        cat_indices = []\n",
    "        \n",
    "        # 迭代每一列\n",
    "        for i, col in enumerate(features):\n",
    "            if features[col].dtype == 'object':\n",
    "                # 使用标签编码器将分类特征映射到整型\n",
    "                features[col] = label_encoder.fit_transform(np.array(features[col].astype(str)).reshape((-1,)))\n",
    "                test_features[col] = label_encoder.transform(np.array(test_features[col].astype(str)).reshape((-1,)))\n",
    "\n",
    "                # 记录分类索引\n",
    "                cat_indices.append(i)\n",
    "    \n",
    "    # 如果标签编码方案无效，则捕获错误\n",
    "    else:\n",
    "        raise ValueError(\"Encoding must be either 'ohe' or 'le'\")\n",
    "        \n",
    "    print('Training Data Shape: ', features.shape)\n",
    "    print('Testing Data Shape: ', test_features.shape)\n",
    "    \n",
    "    # 抽取特征名称\n",
    "    feature_names = list(features.columns)\n",
    "    \n",
    "    # 转化为np arrays形式\n",
    "    features = np.array(features)\n",
    "    test_features = np.array(test_features)\n",
    "    \n",
    "    # 创建k折对象\n",
    "    k_fold = KFold(n_splits = n_folds, shuffle = False, random_state = 50)\n",
    "    \n",
    "    # 特征重要性数组（初始化全为0）\n",
    "    feature_importance_values = np.zeros(len(feature_names))\n",
    "    \n",
    "    # 测试预测性能的数组（初始化全为0）\n",
    "    test_predictions = np.zeros(test_features.shape[0])\n",
    "    \n",
    "    # 保存k折交叉验证输出的数组（初始化全为0）\n",
    "    out_of_fold = np.zeros(features.shape[0])\n",
    "    \n",
    "    # 记录验证和训练分数的列表\n",
    "    valid_scores = []\n",
    "    train_scores = []\n",
    "    \n",
    "    # 在每一折(k-fold)中迭代\n",
    "    for train_indices, valid_indices in k_fold.split(features):\n",
    "        \n",
    "        # 该折的训练数据\n",
    "        train_features, train_labels = features[train_indices], labels[train_indices]\n",
    "        # 该折的验证数据\n",
    "        valid_features, valid_labels = features[valid_indices], labels[valid_indices]\n",
    "        \n",
    "        # 建立模型\n",
    "        model = lgb.LGBMClassifier(n_estimators=10000, objective = 'binary', \n",
    "                                   class_weight = 'balanced', learning_rate = 0.05, \n",
    "                                   reg_alpha = 0.1, reg_lambda = 0.1, \n",
    "                                   subsample = 0.8, n_jobs = -1, random_state = 50)\n",
    "        \n",
    "        # 训练模型\n",
    "        model.fit(train_features, train_labels, eval_metric = 'auc',\n",
    "                  eval_set = [(valid_features, valid_labels), (train_features, train_labels)],\n",
    "                  eval_names = ['valid', 'train'], categorical_feature = cat_indices,\n",
    "                  early_stopping_rounds = 100, verbose = 200)\n",
    "        \n",
    "        # 记录最佳迭代\n",
    "        best_iteration = model.best_iteration_\n",
    "        \n",
    "        # 记录特征重要性\n",
    "        feature_importance_values += model.feature_importances_ / k_fold.n_splits\n",
    "        \n",
    "        # 预测\n",
    "        test_predictions += model.predict_proba(test_features, num_iteration = best_iteration)[:, 1] / k_fold.n_splits\n",
    "        \n",
    "        # 记录折中预测\n",
    "        out_of_fold[valid_indices] = model.predict_proba(valid_features, num_iteration = best_iteration)[:, 1]\n",
    "        \n",
    "        # 记录最佳成绩\n",
    "        valid_score = model.best_score_['valid']['auc']\n",
    "        train_score = model.best_score_['train']['auc']\n",
    "        \n",
    "        valid_scores.append(valid_score)\n",
    "        train_scores.append(train_score)\n",
    "        \n",
    "        # 清除存储\n",
    "        gc.enable()\n",
    "        del model, train_features, valid_features\n",
    "        gc.collect()\n",
    "        \n",
    "    # 显示提交的数据文件\n",
    "    submission = pd.DataFrame({'SK_ID_CURR': test_ids, 'TARGET': test_predictions})\n",
    "    \n",
    "    # 显示重要特征\n",
    "    feature_importances = pd.DataFrame({'feature': feature_names, 'importance': feature_importance_values})\n",
    "    \n",
    "    # 整体验证分数\n",
    "    valid_auc = roc_auc_score(labels, out_of_fold)\n",
    "    \n",
    "    # 将整体验证分数加入数组\n",
    "    valid_scores.append(valid_auc)\n",
    "    train_scores.append(np.mean(train_scores))\n",
    "    \n",
    "    # 相关数据存储\n",
    "    fold_names = list(range(n_folds))\n",
    "    fold_names.append('overall')\n",
    "    \n",
    "    # 验证分数数据集\n",
    "    metrics = pd.DataFrame({'fold': fold_names,\n",
    "                            'train': train_scores,\n",
    "                            'valid': valid_scores}) \n",
    "    \n",
    "    return submission, feature_importances, metrics"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_feature_importances(df):\n",
    "    \"\"\"\n",
    "    画出模型返回的特征重要性，可以使用于任何的重要性评价标准（默认越高越好）\n",
    "    \n",
    "    Args:\n",
    "        df (dataframe): 特征重要性。必须要有'feature'特征列和'importance'特征重要性列\n",
    "        \n",
    "    返回值:\n",
    "        显示出最重要的15个特征\n",
    "        \n",
    "        df (dataframe): 按特征重要性进行排序（从高到低），包括一列标准化后的重要性数值\n",
    "        \"\"\"\n",
    "    \n",
    "    # 按特征重要性进行排序\n",
    "    df = df.sort_values('importance', ascending = False).reset_index()\n",
    "    \n",
    "    # 标准化特征重要性\n",
    "    df['importance_normalized'] = df['importance'] / df['importance'].sum()\n",
    "\n",
    "    # 画出直方图\n",
    "    plt.figure(figsize = (10, 6))\n",
    "    ax = plt.subplot()\n",
    "    \n",
    "    # 反转，将最重要的特征放在最前面\n",
    "    ax.barh(list(reversed(list(df.index[:15]))), \n",
    "            df['importance_normalized'].head(15), \n",
    "            align = 'center', edgecolor = 'k')\n",
    "    \n",
    "    # 设置ytick和label\n",
    "    ax.set_yticks(list(reversed(list(df.index[:15]))))\n",
    "    ax.set_yticklabels(df['feature'].head(15))\n",
    "    \n",
    "    # 标注相关信息\n",
    "    plt.xlabel('Normalized Importance'); plt.title('Feature Importances')\n",
    "    plt.show()\n",
    "    \n",
    "    return df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 控制(Control)\n",
    "任何实验的第一步都是建立一个控制(Control)。为此，我们将使用上面定义的函数（实现梯度增强机模型(GBM)）和单个主数据源（application.csv）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_control = pd.read_csv('application_train.csv')\n",
    "test_control = pd.read_csv('application_test.csv')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "幸运的是，一旦我们花时间编写了一个函数，使用它就非常简单（如果本文有一个中心主题，它就是使用函数来使事情变得更简单和可重用！）上面的函数返回我们可以上传到竞赛的提交数据框架、包含特征重要性的fi数据框架(feature inportance)和具有验证和测试性能的数据框架"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Data Shape:  (307511, 241)\n",
      "Testing Data Shape:  (48744, 241)\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.760007\ttrain's auc: 0.798103\n",
      "Early stopping, best iteration is:\n",
      "[269]\tvalid's auc: 0.760273\ttrain's auc: 0.809199\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.76114\ttrain's auc: 0.798328\n",
      "Early stopping, best iteration is:\n",
      "[289]\tvalid's auc: 0.761398\ttrain's auc: 0.812654\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.750232\ttrain's auc: 0.79964\n",
      "Early stopping, best iteration is:\n",
      "[265]\tvalid's auc: 0.750451\ttrain's auc: 0.809734\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.759831\ttrain's auc: 0.797797\n",
      "Early stopping, best iteration is:\n",
      "[282]\tvalid's auc: 0.760245\ttrain's auc: 0.811121\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.76071\ttrain's auc: 0.798106\n",
      "Early stopping, best iteration is:\n",
      "[226]\tvalid's auc: 0.760972\ttrain's auc: 0.802236\n"
     ]
    }
   ],
   "source": [
    "submission, fi, metrics = model(train_control, test_control)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fold</th>\n",
       "      <th>train</th>\n",
       "      <th>valid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.809199</td>\n",
       "      <td>0.760273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.812654</td>\n",
       "      <td>0.761398</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.809734</td>\n",
       "      <td>0.750451</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.811121</td>\n",
       "      <td>0.760245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.802236</td>\n",
       "      <td>0.760972</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>overall</td>\n",
       "      <td>0.808989</td>\n",
       "      <td>0.758635</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      fold     train     valid\n",
       "0        0  0.809199  0.760273\n",
       "1        1  0.812654  0.761398\n",
       "2        2  0.809734  0.750451\n",
       "3        3  0.811121  0.760245\n",
       "4        4  0.802236  0.760972\n",
       "5  overall  0.808989  0.758635"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "因为训练分数高于验证分数，所以控制器稍微有些过拟合，我们可以在后面的正则化部分中解决这个问题（其实我们已经在使用ReGiaLAMBDA、ReGiAlPH以及早停(early stopping)的过程中执行了一些正则化）\n",
    "\n",
    "我们可以用另一个函数——plot_feature_importances来可视化特征的重要性。在进行特征选择的时候，特征重要性很可能会有些作用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x177000bdf28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fi_sorted = plot_feature_importances(fi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "submission.to_csv('control.csv', index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在比赛中，该控制器的分数为0.745"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 测试一\n",
    "让我们进行第一次测试。我们只需要把数据传递给函数，函数就完成了我们的大部分工作。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Data Shape:  (307511, 452)\n",
      "Testing Data Shape:  (48744, 452)\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.766471\ttrain's auc: 0.810385\n",
      "Early stopping, best iteration is:\n",
      "[293]\tvalid's auc: 0.767203\ttrain's auc: 0.827287\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.767523\ttrain's auc: 0.810288\n",
      "Early stopping, best iteration is:\n",
      "[265]\tvalid's auc: 0.768109\ttrain's auc: 0.822264\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.761029\ttrain's auc: 0.811653\n",
      "Early stopping, best iteration is:\n",
      "[267]\tvalid's auc: 0.761625\ttrain's auc: 0.824147\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.767837\ttrain's auc: 0.809671\n",
      "Early stopping, best iteration is:\n",
      "[236]\tvalid's auc: 0.76815\ttrain's auc: 0.816322\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.767516\ttrain's auc: 0.809788\n",
      "[400]\tvalid's auc: 0.767583\ttrain's auc: 0.842953\n",
      "Early stopping, best iteration is:\n",
      "[306]\tvalid's auc: 0.767902\ttrain's auc: 0.828518\n"
     ]
    }
   ],
   "source": [
    "submission_raw, fi_raw, metrics_raw = model(train, test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fold</th>\n",
       "      <th>train</th>\n",
       "      <th>valid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.827287</td>\n",
       "      <td>0.767203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.822264</td>\n",
       "      <td>0.768109</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.824147</td>\n",
       "      <td>0.761625</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.816322</td>\n",
       "      <td>0.768150</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.828518</td>\n",
       "      <td>0.767902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>overall</td>\n",
       "      <td>0.823708</td>\n",
       "      <td>0.766597</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      fold     train     valid\n",
       "0        0  0.827287  0.767203\n",
       "1        1  0.822264  0.768109\n",
       "2        2  0.824147  0.761625\n",
       "3        3  0.816322  0.768150\n",
       "4        4  0.828518  0.767902\n",
       "5  overall  0.823708  0.766597"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics_raw"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "从数字上看，处理后的特征训练的效果优于原始特征，但是只有把预测数据提交之后，才可以确定这种更好的验证性能是否转移到了测试数据中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17701b35ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fi_raw_sorted = plot_feature_importances(fi_raw)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过检查特征的重要性发现，我们构造的一些特征是似乎是最重要的。我们可以找出本文所做的最重要的100个特征的百分比。但是，我们不仅仅要与原始的特征进行比较，还需要与hot-encode后的原始特征进行比较。这些已经记录在我们的FI（原始数据）中"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "% of Top 100 Features created from the bureau data = 53.00\n"
     ]
    }
   ],
   "source": [
    "top_100 = list(fi_raw_sorted['feature'])[:100]\n",
    "new_features = [x for x in top_100 if x not in list(fi['feature'])]\n",
    "\n",
    "print('%% of Top 100 Features created from the bureau data = %d.00' % len(new_features))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "超过一半的重要特征都是由我们创造的！这让我们相信，我们所做的一切努力都是值得的"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "submission_raw.to_csv('test_one.csv', index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在比赛中，测试一的分数为0.759"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 测试二\n",
    "这很容易，所以让我们继续吧！同以前一样，但将高度共线的变量删除"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Data Shape:  (307511, 318)\n",
      "Testing Data Shape:  (48744, 318)\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.764122\ttrain's auc: 0.8063\n",
      "Early stopping, best iteration is:\n",
      "[264]\tvalid's auc: 0.764565\ttrain's auc: 0.817897\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.7652\ttrain's auc: 0.806611\n",
      "[400]\tvalid's auc: 0.765625\ttrain's auc: 0.839251\n",
      "Early stopping, best iteration is:\n",
      "[379]\tvalid's auc: 0.765829\ttrain's auc: 0.836334\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.757092\ttrain's auc: 0.808063\n",
      "Early stopping, best iteration is:\n",
      "[198]\tvalid's auc: 0.757149\ttrain's auc: 0.807627\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.764131\ttrain's auc: 0.806097\n",
      "Early stopping, best iteration is:\n",
      "[287]\tvalid's auc: 0.76481\ttrain's auc: 0.821551\n",
      "Training until validation scores don't improve for 100 rounds.\n",
      "[200]\tvalid's auc: 0.763964\ttrain's auc: 0.806256\n",
      "[400]\tvalid's auc: 0.763928\ttrain's auc: 0.838649\n",
      "Early stopping, best iteration is:\n",
      "[312]\tvalid's auc: 0.764449\ttrain's auc: 0.825298\n"
     ]
    }
   ],
   "source": [
    "submission_corrs, fi_corrs, metrics_corr = model(train_corrs_removed, test_corrs_removed)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>fold</th>\n",
       "      <th>train</th>\n",
       "      <th>valid</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>0.817897</td>\n",
       "      <td>0.764565</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>0.836334</td>\n",
       "      <td>0.765829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2</td>\n",
       "      <td>0.807627</td>\n",
       "      <td>0.757149</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>3</td>\n",
       "      <td>0.821551</td>\n",
       "      <td>0.764810</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>4</td>\n",
       "      <td>0.825298</td>\n",
       "      <td>0.764449</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>overall</td>\n",
       "      <td>0.821741</td>\n",
       "      <td>0.763352</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      fold     train     valid\n",
       "0        0  0.817897  0.764565\n",
       "1        1  0.836334  0.765829\n",
       "2        2  0.807627  0.757149\n",
       "3        3  0.821551  0.764810\n",
       "4        4  0.825298  0.764449\n",
       "5  overall  0.821741  0.763352"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics_corr"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "这些结果优于之前的控制器，但是略低于原始特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA14AAAGECAYAAAAm4vGSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3XucX9O9//HXG8EkISrF4WiFNNW61IiotlEVVRQtWre45rRup5Sjh1LRdGhdWipNSluNVmipoKpIj+uRurTHfSIRl69USvmRhDZEBhGf3x97DTtf35n5zuU73z2T9/PxmEf2XnvttT7fvSbMJ2vtNYoIzMzMzMzMrHZWqncAZmZmZmZm/Z0TLzMzMzMzsxpz4mVmZmZmZlZjTrzMzMzMzMxqzImXmZmZmZlZjTnxMjMzMzMzqzEnXmZmZmZmZjXmxMvMzKwHSJoqKSp8HdjD/bwtaVxPttnFOGZIuqTecbRH0vZpDIbVOxYzs1XqHYCZmVk/cjewf1nZv+oRSDUkrRoRb9U7jlqQtGq9YzAzy/OMl5mZWc95KyJeLPt6o/WipAMlNUt6Q9I8SRdIGpS7/oU0k/SKpEWS/izpk7nr84CVgUtbZ9RS+ThJb+cDkbRhqrNjOt8xne8h6R5JbwBHpWvbSLpV0mJJCyRdJ2mjznzwFPevJP1A0nxJ/5J0lqSVJE2Q9FJq+6yy++alepdIelXSQkk/lLRSrs4aki5O978h6UFJu+SuD0uf7WBJf5L0OnAlWSIM8Ey6PiPVHynpf1KciyU9IGm3CnGdKWlSGo+XJJ0vaeWyesdKmiPpzdTetblrq0hqkvRMivsxSUeX3X+EpMfT9Zcl3SVpw848ezPrG5x4mZmZ9YK0PPDnwI+BzYDDgJ2BX+SqDQYuAj4FfAYoATdLGpqubwssA/4LWD99ddaPgR8BHweul7QZ8Gfgr8AoYKfUx22SVu9k2/sCA4DtgW8BpwE3pc/1WeAk4DRJXyy775vAC2Sf70TgOLLP2OrXwK7AIcDWwL3ATZI+VtbOD8kSri2BU4C9UvknyZ7VV9L5msBVwI7ASOAW4AZJH60Q1/8DtgOOTzEd1npR0hmpz5+lPncDmnP3X5L6PJrseZ8J/FDS19P925CN/znApimeyzGzfkkRUe8YzMzM+jxJU8kSgzdyxS9FxPB0fR5wbkT8InfPDmRJz9oR8c8Kba4EvAwcFxFXpLK3gSMiYmqu3jjgkohYJVe2IfAcMCYiZqSZrzuBwyLiN2Vxrx4RB+bKVgP+CRwUEde38XlnAE9HxBG587UiojFX5zHgnYjYMlc2E7gtIk7KPZfnIuKzuTpnpzg3lPQRsgR0j4j4U67Ow0BzRHwtvcP1DDAhIr6fq7M92azXxhExr9LnKIvr6og4KxfXoxHx5Vydm4F/RsTYNFO5EPhuRJxfob2NgbnAZhHxRK58AvCViGiUtA8wFfhQRLzaXnxm1vf5HS8zM7Oecx9weO78bQBJ6wAbARdIyv+QrvTnR4AH0g/rZwKfBtYlW5kyMN3bU+4vO98W+IikxWXlqwMjOtn2zLLzF9NXedm6ZWV/LTu/F/iOpDXJZgcB7iqrcxfZc8or/2wVpfE4g2x279/Ifh5anfc/5+ay8+eBjdPx5umeW9voZhTZ+D4oKV++CtmMIsBtwN/IlkLeBvwvcF1ELKzmc5hZ3+LEy8zMrOe0RMTTFcpbl/afQDbrVO4f6c+byGZRjiWbrXoLuAfoaKOIdyqUDWij7usVYvsNcG6Fui930G+5pWXn0UZZR686qIPrrXXKl+2Uf7a2TAU+DHybbKashWzpYflzLt94pFLsbS0daq33GWBJpXsiYrGkUcBosmWnxwA/kvT5iHioqk9iZn2GEy8zM7Mai4iXJD0HbBoRUyrVSe9xbQbsHhG3pLINef/s0FtkG2zkzQdWlrReRLyUykZWGd6DwCeAuVG/9w8+VXb+aeCFiHg1LVcE2AH4U67OZ4FHOmi3NXEqf147AN+OiBsA0rLBTYDZnYh5Dtmy0l2BWRWutyZOH46Im9pqJCKWkc3e3SXpe6ndg3L3m1k/4c01zMzMesd44HhJp0vaQtKmkvaWdHG6/k9gAXCkpI9K+jTwO7LZmLxngDGSNpD0wVR2P/AacK6kEWmHvglVxnU22cYPv5X0SUkbSxqTdvPbpBuftzMa0+5/H5V0ENnM4ESAiJgLXAP8TNKukj4maRKwBXBeB+3+nWw2cHdJ60oaksqfBA6WtKWkRrLnXJ6ctSsiFpNtVNKUdjb8qKStJH0nXX+abFOQKZIOlfSRdP1rkk4BkLSXpBOV7Sr5YWBv4ENkyZeZ9TNOvMzMzHpB2tBif2APskTpAaCJ7L0hIuIdYD9gOPAo2XK4n5Dtqpf338A2ZAnYgnTvK8BYspmjR4Hvki2jqyaux8mWww0m291vDjAFaKD3fgfZT8ner3oQuJBs98eJuetHpNh+S/Ye2Whgz/ymFZWk2b/vAKeSPcc/pkv/QfYz0P3A9cDNZOPRWd8lJdRks2W3svxM41Hpc4wne653kL0D+Ld0/Z/Al1L/T5HtNvkDsoTNzPoZ72poZmZmdZN2D7wkIn5Q71jMzGrJM15mZmZmZmY15sTLzMzMzMysxrzU0MzMzMzMrMY842VmZmZmZlZj/j1eZgWyaNEiT0GbmZmZ9XFDhgx53y+C94yXmZmZmZlZjTnxMjMzMzMzqzEnXmZm7SiVSvUOwXI8HsXi8Sgej0mxeDyKpd7j4cTLzMzMzMysxpx4mZmZmZmZ1ZgTLzMzMzMzsxpz4mVmZmZmZlZjTrzMzMzMzMxqzImXmZmZmZlZjTnxMjMzMzMzqzEnXmZmZmZmZjXmxMvMzMzMzKzGnHiZmZmZmZnVmBMvMzMzMzOzGnPiZWZmZmZmVmOr1DsAM6tsjxOa6h2CAS1LWmgY2FDvMCzxeBSLx6N4PCbF4vGor+FDBzF5wsn1DuNdTrzMCurexiPrHYKZmZlZ39U8pd4RLMdLDc3MzMzMzGrMiZeZmZmZmVmNOfEyMzMzMzOrMSdeVhOSlklqzn2dKmllSQ9J2iFX71ZJ+0m6L9V7VtKC3H3D2mj/a5JmSXpU0mxJe6VySTpdUknSU5LulLR57r7FZe2Mk3RhOm6S9Hzqd46ksWV1T5L0ROpvpqTDUvkMSU/mYr62neeyg6SHJb0tad/OP1kzMzMz64u8uYbVSktENJYXSvoGcImkkcC+QETENcA16fo4YFREHNdWw5I2BMYDIyNikaTBwDrp8rHAZ4CtImKJpF2AGyRtHhFvVBH3xIg4X9II4CFJ10bEUknHAF8APhkRr0oaAuydu+/giHiwivafBcYBJ1VR18zMzMz6CSde1qsi4j5JfwGagIPIkpnOWhd4DVic2lzcegycAuwYEUvStVtTfwcDv+pEnCVJS4APAPOB04AxEfFqur4IuKyzgUfEPABJ73T2XjMzMzPru5x4Wa00SGrOnZ8TEdPS8XeA54CfRMTTXWh7JvAS8IykO4DrIuJGSWsCgyJibln9B4HNyxtpT5qRK0XEfElrAGtUaDfvCkkt6fi2iCjOL40wMzMzWwG1LGmhVCotV1Z+3pNGjBjR7nUnXlYrFZcaJjsAi4AtutJwRCyTtBuwLfB5YKKkbYAL2rhFQLTXZO74RElHApsAu1V5P1S/1NDMzMzMekHDwIblkqFSqdRhclRL3lzDepWkQcCPgJ2AdSTt3pV2InN/RJwDHAh8NS0DfF3SJmXVRwJz0nGLpFVz19YGFubOJ0bEpsABwOWSVm+nXTMzMzOzqjjxst42Abg6Ip4AvkE2W7V6ZxqQtEFaCtiqEfh7Oj4PmCypIdXdGdgeuDJd/zNwSLrWAOwP3FneR0RcR7ZE8fBUdA5wUVrOiKQ1JR3VmbjNzMzMbMXlpYZWK+XveN0MXA7sA2wFEBHNkm4h2xDjjE60PQA4X9IGwBvAAuCYdO2nZBtizJK0DHgR2CsiWt+/OgG4WNLxZEsIL4+Iu9ro50zgSklTgJ8Dg4EHJC0FlgI/ztXNv+O1MCJ2rtSgpG2BP6QYvyTpjIjo1PtnZmZmZtb3KKKjV1fMrLcsWrTo3b+Qa136fD1DMTMzM+vTRjdPYfqkpnfPe/MdryFDhqi8zEsNzczMzMzMasxLDa3QJN0HrFZWfGhEzKpHPNWSNB7Yr6z4mog4qx7xmJmZmVl9OfGyQouI7eodQ1ekBKtbSdbo5ik9FI11R8uSFhoGNtQ7DEs8HsXi8Sgej0mxeDzqa/jQQfUOYTlOvMwKKr8m2eqn3r/zw5bn8SgWj0fxeEyKxeNheX7Hy8zMzMzMrMaceJmZmZmZmdWYlxqaFdQeJzTVOwTD6/OLxuNRLB6P4vGY9JzhQwcxecLJ9Q7D+hEnXmYFdW/jkfUOwczMbMXlTa6sh3mpoZmZmZmZWY058TIzMzMzM6sxJ15mZmZmZmY15sTLakLSMknNua9TJa0s6SFJO+Tq3SppP0n3pXrPSlqQu29YG+1/TdIsSY9Kmi1pr1QuSadLKkl6StKdkjbP3be4rJ1xki5Mx02Snk/9zpE0tqzuSZKeSP3NlHRYKp8h6clczNe281yOSXE3S7pH0madf7pmZmZm1td4cw2rlZaIaCwvlPQN4BJJI4F9gYiIa4Br0vVxwKiIOK6thiVtCIwHRkbEIkmDgXXS5WOBzwBbRcQSSbsAN0jaPCLeqCLuiRFxvqQRwEOSro2IpZKOAb4AfDIiXpU0BNg7d9/BEfFgFe1fGRG/SJ/jy8AFwG5V3GdmZmZmfZgTL+tVEXGfpL8ATcBBZMlMZ60LvAYsTm0ubj0GTgF2jIgl6dqtqb+DgV91Is6SpCXAB4D5wGnAmIh4NV1fBFzW2cBb708GAdHZNszMzMys73HiZbXSIKk5d35ORExLx98BngN+EhFPd6HtmcBLwDOS7gCui4gbJa0JDIqIuWX1HwQ2L2+kPWlGrhQR8yWtAaxRod28KyS1pOPbIqLNX/wh6VjgW8CqwE6dicvMzMx6R8uSFkqlUrfb6Yk2rOfUcjxGjBjR7nUnXlYrFZcaJjsAi4AtutJwRCyTtBuwLfB5YKKkbciW7VUi2p9Zyl87UdKRwCa8twSwo/uh+qWGRMRFwEWSDgJOBw6v5j4zMzPrPQ0DGzr8QbojpVKp221Yz6n3eHhzDetVkgYBPyKb6VlH0u5daScy90fEOcCBwFfTMr7XJW1SVn0kMCcdt0haNXdtbWBh7nxiRGwKHABcLmn1dtrtrqtY/j0xMzMzM+unnHhZb5sAXB0RTwDfIJutWr0zDUjaIC0FbNUI/D0dnwdMltSQ6u4MbA9cma7/GTgkXWsA9gfuLO8jIq4jW6LYOht1Dtks1Zrp3jUlHdWZuNN9+X9m2QPw+gMzMzOzFYCXGlqtlL/jdTNwObAPsBVARDRLuoVsQ4wzOtH2AOB8SRsAbwALgGPStZ+SbYgxS9Iy4EVgr4hoff/qBOBiSceTLSG8PCLuaqOfM4ErJU0Bfg4MBh6QtBRYCvw4Vzf/jtfCiNi5jTaPS8ngUuCfeJmhmZmZ2QpBEd5UzawoFi1a9O5fyLUufb6eoZiZma3QRjdPYfqkpm61Ue93imx5vTkeQ4YMUXmZlxqamZmZmZnVmJcaWqFJug9Yraz40IiYVY94qiVpPLBfWfE1EXFWPeIxMzMzs/py4mWFFhHb1TuGrkgJVreSrNHNU3ooGuuOliUtNAxsqHcYlng8isXjUTwek54zfOigeodg/YwTL7OC6u66cusZXp9fLB6PYvF4FI/HxKy4/I6XmZmZmZlZjTnxMjMzMzMzqzEvNTQrqD1OaKp3CIbflygaj0exeDyKx2PSM4YPHcTkCSfXOwzrZ5x4mRXUvY1H1jsEMzOzFZM3uLIa8FJDMzMzMzOzGnPiZWZmZmZmVmNOvMzMzMzMzGrMiZfVhKRlkppzX6dKWlnSQ5J2yNW7VdJ+ku5L9Z6VtCB337A22v+apFmSHpU0W9JeqVySTpdUkvSUpDslbZ67b3FZO+MkXZiOmyQ9n/qdI2lsWd2TJD2R+psp6bBUPkPSk7mYr23nuXwrtf2opDskbdT5p2tmZmZmfY0317BaaYmIxvJCSd8ALpE0EtgXiIi4BrgmXR8HjIqI49pqWNKGwHhgZEQskjQYWCddPhb4DLBVRCyRtAtwg6TNI+KNKuKeGBHnSxoBPCTp2ohYKukY4AvAJyPiVUlDgL1z9x0cEQ9W0f4j6fMtkfSfwI+AA6q4z8zMzMz6MCde1qsi4j5JfwGagIPIkpnOWhd4DVic2lzcegycAuwYEUvStVtTfwcDv+pEnCVJS4APAPOB04AxEfFqur4IuKyzgUfEnbnT/wMO6WwbZmZmZtb3OPGyWmmQ1Jw7PycipqXj7wDPAT+JiKe70PZM4CXgGUl3ANdFxI2S1gQGRcTcsvoPApuXN9KeNCNXioj5ktYA1qjQbt4VklrS8W0RUc0v//g68D+dicvMzMxqr2VJC6VSqUfa6ql2rGfUcjxGjBjR7nUnXlYrFZcaJjsAi4AtutJwRCyTtBuwLfB5YKKkbYAL2rhFQLTXZO74RElHApsAu1V5P1S/1DBrUDoEGAV8rtp7zMzMrHc0DGzo8IfoapRKpR5px3pGvcfDm2tYr5I0iOy9pp2AdSTt3pV2InN/RJwDHAh8NS0DfF3SJmXVRwJz0nGLpFVz19YGFubOJ0bEpmTvXV0uafV22u0SSTuTvaP25Yh4syfaNDMzM7Nic+JlvW0CcHVEPAF8g2y2avXONCBpg7QUsFUj8Pd0fB4wWVJDqrszsD1wZbr+Z9J7VanO/kD+vSsAIuI6siWKh6eic4CL0nJGJK0p6ajOxJ3u2xq4mCzpmt/Z+83MzMysb/JSQ6uV8ne8bgYuB/YBtgKIiGZJt5BtiHFGJ9oeAJwvaQPgDWABcEy69lOyDTFmSVoGvAjsFRGt71+dAFws6XiyJYSXR8RdbfRzJnClpCnAz4HBwAOSlgJLgR/n6ubf8VoYETu30eZ5qZ1rJAE8GxFf7sRnNzMzM7M+SBEdvbpiZr1l0aJF7/6FXOvS5+sZipmZ2QprdPMUpk9q6nY79X6nyJbXm+MxZMgQlZd5qaGZmZmZmVmNeamhFZqk+4DVyooPjYhZ9YinWpLGA/uVFV8TEWfVIx4zMzMzqy8nXlZoEbFdvWPoipRgdSvJGt08pYeise5oWdJCw8CGeodhicejWDwexeMx6RnDhw6qdwjWDznxMiuonlhbbt3n9fnF4vEoFo9H8XhMzIrL73iZmZmZmZnVmBMvMzMzMzOzGvNSQ7OC2uOEpnqHYPh9iaLxeBSLx6N42hqT4UMHMXnCyXWIyMxaOfEyK6h7G4+sdwhmZtZfeMMms7rzUkMzMzMzM7Mac+JlZmZmZmZWY068zMzMzMzMasyJlxWKpGWSmiU9JmmmpG9JWqmsziRJz7eWS9pc0lOSGnJ1pks6UNJ6km5Kbc2R9Kd2+h4mqSX1P1PSXyRtmq7tKOmmdDxO0oJU7wlJJ6by8amsOfc5miUdL6lJ0kll/c2T9MGee3pmZmZmVlROvKxoWiKiMSI2B74A7A58r/ViSrb2AZ4DdgCIiMeA64Dxqc7ewICIuAo4E7gtIraKiM2AUzvof27qfyvgMuC0NupNi4hGYDQwXtKHIuKsdG9j7nM0RsTkLj0JMzMzM+s3nHhZYUXEfOAo4DhJSsVjgNnAz4GxuepnAvtJagTOBY5N5esD/8i1+WgnQlgT+GcHMb4MPJ36MTMzMzOryNvJW6FFxN/SLNe6wEtkydbvgD8CZ0saEBFLI2JJWsp3F3BBRJRSExcB0yQdB9wOXBoRL7TT5XBJzcAawEBgu/bik/RhYHWgmoTuREmH5M43qOIeMzOzbmtZ0kKpVOq4ovU4P/diqeV4jBgxot3rTrysLxCApFXJlh6eGBGvSboP2AWYDhARN0r6F/Cz1hsj4hZJmwC7AV8EHpG0RUQsaKOvuWmpIJIOAH6Z7i13gKQxwKbAkRHxRhWfY2JEnP/uh5LmVXGPmZlZtzUMbOjwh0LreaVSyc+9QOo9Hl5qaIWWkqZlwHyyBGgIMCslLduz/HJDgHfS17si4pWIuDIiDgUeIL0bVoUb2qk7Lb2H9lngx5L+rco2zczMzGwF5MTLCkvSOsAvgAsjIsiSrCMiYlhEDAM2BnaRNLCdNnZqvS5pDWA48GyVIWwPzG2vQkT8FfgNcEKVbZqZmZnZCshLDa1oGtI7VgOAt8mSmgtS8rQrcHRrxYh4XdI9wJeAaW20tw1woaS3yf6h4ZKIeKCd/lvf8RLwFnBEFTH/EHhY0tkR8VoV9c3MzMxsBePEywolIlZu49ISYO0K9b9Sdj6s7Pw84Lwq+54HNLRxbQYwIx1PBabmrr0A/FtZ/cFl500V2hxWXmZmZmZm/ZOXGpqZmZmZmdWYZ7xshSNpS7IljHlvRkS7W8ebmZmZmXWVEy9b4UTELKCx3nF0ZHTzlHqHYGS/+6ZhYMUVqFYHHo9i8XgUT1tjMnzooDpEY2Z5TrzMCmr6pKZ6h2DU/3d+2PI8HsXi8Sgej4lZcfkdLzMzMzMzsxpz4mVmZmZmZlZjXmpoVlB7nNBU7xAMv8NSNB6PYvF4FE9+TIYPHcTkCSfXOSIza+XEy6yg7m08st4hmJlZX+ZNmswKxUsNzczMzMzMasyJl5mZmZmZWY058TIzMzMzM6sxJ15WKJL2kRSSPpbOh6Xz7+fqfFDSUkkXShovqTl9LcsdH99OH4dJmi3pMUlzJJ2UyqdKeibdP1PS53P3zJD0ZK79a1N5k6TnU1lJ0nWSNiu7b5Sk+1KdZyUtyLUzrOefopmZmZkVjTfXsKIZC9wDHAg0pbK/AXsC303n+wGPAUTEWcBZAJIWR0Rje41L+iLwX8AuEfGCpNWBQ3NVTo6IayWNAX4J5H8L5cER8WCFZidGxPmp/QOA/5W0ZUQsaK0QEdul6+OAURFxXLtPwczMzMz6Fc94WWFIGgyMBr5Olni1agEelzQqnR8AXN3Fbr4DnBQRLwBExBsRUWnbp78C/97ZxiNiGnArcFAX4zMzMzOzfsgzXlYkewM3R8RTkl6RNBJ4JV27CjhQ0ovAMuAFYIMu9LEF8FAV9XYDri8ru0JSSzq+LSLa+uUoDwMf60JsZmZmPaZlSQulUqneYazwPAbFUsvxGDFiRLvXnXhZkYwFfpKOr0rnF6Xzm4HvAy8B02oYw3mSfgSsC3yq7FpbSw3LqefDMjMz65yGgQ0d/iBotVUqlTwGBVLv8fBSQysESUOBnYBLJM0DTiZbUiiAiHiLbKbqv4Hfd6Orx4Bt2rl+MvAR4HTgsi72sTXweBfvNTMzM7N+yImXFcW+wOURsVFEDIuIDwHPABvm6vwYOCUiXu5GP+cAP5L0bwCSVivfATEi3gEmAStJ2rUzjUv6KrAL8LtuxGhmZmZm/YyXGlpRjAXOLSv7PXBa60lEPEbazbCrIuJPktYDbpckIIBfV6gXkn4AfBu4JRXn3/FaGBE7p+MTJR0CDAJmAzvldzQ0MzMzM1NE1DsGM0sWLVr07l/ItS59vp6hmJlZHze6eQrTJzXVO4wVWr3fKbLl9eZ4DBky5H3v/HupoZmZmZmZWY15qaH1S5LGk/2i5bxr0i9cNjMzMzPrVU68rF9KCVafTrJGN1f6vc7W21qWtNAwsKHeYVji8SgWj0fx5Mdk+NBBdY7GzPKceJkVlNflF4PX5xeLx6NYPB7F4zExKy6/42VmZmZmZlZjTrzMzMzMzMxqzEsNzQpqjxOa6h2C4XdYisbjUSwdjcfwoYOYPOHkXozIzKy4nHiZFdS9jUfWOwQzs+7xJkFmZu/yUkMzMzMzM7Mac+JlZmZmZmZWY068zMzMzMzMasyJl/U6SftICkkfS+fD0vn3c3U+KGmppAsljZfUnL6W5Y6P76CfmZJ+V1Y2VdLzklbL9TOvLI5v5upfKGlcOp4haVTu2jBJs9PxjpJukvQfufjekjQrHV8j6SlJDbn7p0s6sOtP0szMzMz6CideVg9jgXuAfNLxN2DP3Pl+wGMAEXFWRDRGRCPQ0nocEZPb6kDSx8m+v3eQNKjs8jLga23cOh84QdKqnfpESURcmov1BWBMOt8PuA4Yn+LbGxgQEVd1pR8zMzMz61uceFmvkjQYGA18neUTrxbg8dyM0gHA1d3o6iDgN8CtwJfLrv0EOFFSpV09FwB3AId3o++2nAnsJ6kROBc4tgZ9mJmZmVkBeTt56217AzdHxFOSXpE0EnglXbsKOFDSi2SzUi8AG3SxnwOALwCbAscB+SWHz5LNuB0K3Fjh3nOB/5H06y72XVFELJF0EnAXcEFElHqyfTOzomlZ0kKp5P/U9TY/82LxeBRLLcdjxIgR7V534mW9bSzZjBNkidZY4KJ0fjPwfeAlYFpXO5C0LbAgIv4u6R/AryV9ICL+mat2NnADML38/oh4RtL9ZLNmy12q0F2lsjZFxI2S/gX8rDP3mZn1RQ0DGzr8QcR6VqlU8jMvEI9HsdR7PJx4Wa+RNBTYCdhCUgArkyUuPwOIiLckPQT8N7A58KUudjUW+FjrphnAmsBXgUtaK0TE05Kagf3baONs4Fqy2alWLwMfyJ2vDSzsQnzvpC8zMzMzW0H4HS/rTfsCl0fERhExLCI+BDwDbJir82PglIh4uSsdSFqJbGOOT6Q+hgF7kSVj5c4CTqrUTkQ8Acxh+Q0/ZgCHSFI6Pxy4sytxmpmZmdmKxYmX9aaxwB/Kyn4PnNZ6EhGPRcRl3ehjB+D5iHg+V3YXsJmk9fMVI+Ix4OF22jqL5ZPCXwKvATMlzQQGA+d3I1YzMzMzW0F4qaH1mojYsULZZKDitvARMRWYWlY2uIM+ZgCfKitbBrQmXePKrn0ldzwP2CJ3PpPcP05ExFtkG3W01e+MsrJhbdStWG5mZmZm/ZdnvMzMzMzMzGrMM17WZ0kaT/Y+V941EXFWPeIxMzMzM2uLEy/rs1KC1W+TrNHNU+odgpH9HqKGgQ31DsMSj0exdDQew4cO6sVozMyKzYmXWUFNn9RU7xCM+v/OD1uex6NYPB5AhHnuAAAgAElEQVRmZtXzO15mZmZmZmY15sTLzMzMzMysxrzU0Kyg9jihqd4hGH6nqGg8Hh0bPnQQkyecXO8wzMysjBMvs4K6t/HIeodgZn2RN+YxMyskLzU0MzMzMzOrMSdeZmZmZmZmNebEy8zMzMzMrMaceFmnSFomqVnSY5JmSvqWpJXK6kyS9HxruaTNJT0lqSFXZ7qkAyWtJ+mm1NYcSX9qp+9hklpS/61fh6Vr8yTdXVa/WdLsdLyjpEWSHpH0uKTv5cpvqtDXqpJ+ImmupJKkP0raUJl7JH0xV3d/STeXPZ/Wr1NT+QxJT0p6VNITki6UtFbnR8DMzMzM+iJvrmGd1RIRjQCS1gWuBIYArYnMSsA+wHPADsCMiHhM0nXAeOB0SXsDAyLiKkkXA7dFxKR0/yc66H9ua/8VrCHpQxHxnKSPV7h+d0TsKWkQ0Fwp4co5G1gD+GhELJP0H8B1wHbAMcA1ku4EVgbOAnYrfz4VHBwRD0paFTgH+CPwufY+rJmZmZn1D57xsi6LiPnAUcBxkpSKxwCzgZ8DY3PVzwT2k9QInAscm8rXB/6Ra/PRboR0NXBAOh4L/K6NuF8HHgKGV7ouaSDwH8CJEbEs3XMp8CawU0TMBm4ETiFLOC+PiLnVBhkRbwHfBj4saatq7zMzMzOzvsszXtYtEfG3NMu1LvAS7yU8fwTOljQgIpZGxBJJJwF3ARdERCk1cREwTdJxwO3ApRHxQjtdDpfUnDv/ZkS0LjG8FpgKnA98CTgYOLS8AUlDgU8B3wfWqdDHR4BnI+LVsvIHgc2BO4AzgIeBt4BRuToNZfGdExHTyjtIs2gzgY8BMyt/VDOzzmtZ0kKpVOq4Yg/pzb6sOh6TYvF4FEstx2PEiBHtXnfiZT1BkL0XBexONlP0mqT7gF2A6QARcaOkfwE/a70xIm6RtAnZUr0vAo9I2iIiFrTRV3tLDV8B/inpQOBxYEnZ9c9KegR4Bzg3LYHcsY3PE+2VR8TrkqYBiyPizVyd9pYaVmrPzKxHNQxs6PB//j2lVCr1Wl9WHY9JsXg8iqXe4+HEy7olJU3LgPlks0xDgFlp5eFAsuRneu6Wd9LXuyLiFbJ3xa5M713tAPy+iyFNI5tFG1fh2t0RsWcVbTwNbCRpjYh4LVc+kmyJYav3fZZqSVoZ2JIsQTQzMzOzfs7veFmXSVoH+AVwYUQE2TLDIyJiWEQMAzYGdknvTLXVxk6t1yWtQfbe1bPdCOsPwI+AW7raQHoH7DLggpQgkXZPHAj8bzdiI7U1gGxzjee6+U6bmZmZmfURnvGyzmp9h2kA8DbwG7IEZSCwK3B0a8W0HO8espmw973nlGwDXCjpbbJ/CLgkIh5op//yd7x+HRGTc32+BvwQ4L39Pjr0eUn/yJ3vB3yH7F2xpyS9AzwB7JMSzPaUv+N1c0Scmo6vkPQmsBrZ+2x7VRugmZmZmfVtTrysUyJi5TYuLQHWrlD/K2Xnw8rOzwPOq7LveUBDG9eGVSibB2yRjmcAMyrUmdFWm8A301db8TRVKKv4fCJix7baMTMzM7P+z0sNzczMzMzMaswzXlY4krYkW8KY92ZEbFePeMzMzMzMusuJlxVORMwCqt2Svd8a3Tyl3iEY2e9EahjY1mpU620ej44NHzqo3iGYmVkFTrzMCmr6pKZ6h2DU/3d+2PI8HmZm1lf5HS8zMzMzM7Mac+JlZmZmZmZWY15qaFZQe5zQVO8QDL9TVDRFGY/hQwcxecLJ9Q7DzMz6ECdeZgV1b+OR9Q7BzNrizW/MzKyTvNTQzMzMzMysxpx4mZmZmZmZ1ZgTLzMzMzMzsxorZOIlaZik2fWOoy2Spkp6RtJMSU9JulzSv5fV2VpSSNo1nUvSPZK+mKuzv6Sb0/F4SY9JelRSs6Tt2ul/gKRzJZUkzZZ0f2u7kuZJmpXa+bOkjXL3LUttt36dmspnSHoy3fOEpAslrZW7b7GkLXP3vZI+f7Ok29uIcZiklrL+DsvF+Ptc3X0lTU3H4yQtkPRI+ny3SPpMN5/90FwML0p6Pne+alvPxczMzMysp/S7zTUkrRIRb/dCVydHxLWSBPwXcKekLSLirXR9LHBP+vOWiAhJxwDXSLoTWBk4C9hN0qeBPYGREfGmpA8Cq7bT9/eB9YEtUv31gM/lro+JiIWSzgBOB1p3aWiJiMY22jw4Ih6UtCpwDvDHfJsRMQtohCz5AW6KiGs7eEZz2+lvlKTNI+KxCtemRcRxqa8xwHWSxkTE4+l6Z5/9y7nYm4DFEXF+a2eS2nsuZmZmZmbdVsgZr2QVSZelWZhrJQ1MMyUfBJA0StKMdNwk6ZeSbgUul7SypPMkPZDuPzrVGyzpDkkPp1mhvVL5cjNskk5KP6B3KDITgReB1lknAfsC44BdJK2e6s4GbgROAb4HXB4Rc8mSqIUR8WaqtzAiXqjUn6SBZInUN3P1X4qIqytU/yvw7xXK2/s8bwHfBj4saavO3NtJ5wOnVRHPncAvgaMqXKv62feU9D14tqS/SnpQ0sg0Kzc3JdbtfZ9tm74fV5c0SNkM5xY9GZ+ZmZmZFVORZ7w2Bb4eEfdK+jXwjQ7qbwNsHxEtko4CFkXEtpJWA+5NSdlzwD4R8WpK4P5P0g09FO/DwMfIZopGA89ExNyUHO4OXJfqnZHqvgWMSmW3AhMkPQXcTjbj8+c2+vkI8GxEvFpFTLsB1+fOGyQ1587PiYhp5TdFxDJJM9PnmVlFP20ZXtbfNyPi7nR8NfANSR+pop2HgaM7uF7Ns29LVc8l57mI+LSkicDU1OfqwGPAL4A3qPB9FhEPpO+3HwANwG9TMm5mfUzLkhZKpVK9wygEP4fi8ZgUi8ejWGo5HiNGjGj3epETr+ci4t50/Fvg+A7q3xARLel4F+ATkvZN50OAEcA/gLMl7QC8QzYbtF4Pxavc8VjgqnR8FXAo6Yf/iHhd0jSy5W6tM1aLJW0DfBYYA0yTdGpETO1iLHem5YfzyZYaturMkjp1XKVD7S01XAacB3wH+J9uxlLVs29HZ5catibrs4DBEfEa8JqkN5S9G/c6lb/PXgTOBB4gS846+p42s4JqGNjQ4f9gVwSlUsnPoWA8JsXi8SiWeo9HkROvqHD+Nu8tjyxfQvZ67lhksyu35CtIGgesA2wTEUslzUvt5Nut1HY1tgbukLQy8FXgy5LGp1iGSloj/YAO2Q/j7yz34SKWATOAGZJmAYeTzaaUe5psGWC+vXJjyJ7HVLIf9L/VmQ+SPsOWwOMd1e2m35AlXpXe88rbuoNYOvPse8Kb6c93cset56sAB1P5+wxgbWAwMCCV5b9vzczMzKyfKvI7Xh9Om07Ae5slzCNbUgjZD9htuQX4T0kDACR9VNIgspmv+emH4TFA645/LwHrKtv9bjWyjS6qoszxZO9p3QzsDMyMiA9FxLCI2Aj4PbB3O21sKimffjcCf69UNyKWAL8CJqeNMJC0vqRDyuq1kG08cZiktTvxeQaQba7xXEQ8Wu19XRERS4GJZHG2Fc/nyN7vmlLhWreffY209X0G2ftq3wWuAH7Yy3GZmZmZWZ0UOfF6HDhc0qNkswQ/J3s/apKku8mWqrXlEmAO8HDaNONispmIK8h203uQbFbiCXg3ATgTuA+4qbW8A+el96CeArYl20nwLbIk8Q9ldX8PHNROW4OByyTNSZ93M6CpnfqnAwuAOenzXZ/OlxMR/w/4HXBsKmrQ8tumn5urfkXqezYwCNirnf6rNbysv0pL637F+2deD0j1nyLbgOOruR0NoWefPbT/XLqi4veZsu30346IK4FzgW0l7dTNvszMzMysD1BE+Yo+M6uXRYsWvfsXcq1Ln69nKGbWjtHNU5g+qaneYdRdvd+XsPfzmBSLx6NYenM8hgwZ8r49Coo842VmZmZmZtYvFHlzjbqTdBHZVuF5kyLi0l7q/w/AxmXFp5RvGlJPkrYk2yQj782I2K4e8fSUvvDszczMzKzvcOLVjog4tuNaNe1/n3r2X42ImEW2GUi/UoRnP7r5ffuJWB20LGmhYWBDvcOwpCjjMXzooHqHYGZmfYwTL7OC8vsjxeD1+cXi8TAzs77K73iZmZmZmZnVmBMvMzMzMzOzGvNSQ7OC2uOEpnqHYBTnnSLL1HI8hg8dxOQJJ9ekbTMzMydeZgV1b+OR9Q7BbMXiDW3MzKyGvNTQzMzMzMysxpx4mZmZmZmZ1ZgTLzMzMzMzsxpz4mUdkrRMUrOkxyTNlPQtSSuV1Zkk6fnWckmbS3pKUkOuznRJB0paT9JNqa05kv7UTt/DJM1OxztKWiTpEUlPSrpL0p4dxN6U4mqWNFvSl1P5VEn7ltVdnOuzJd0zU9JfJG2ai+GmCv3MkDQqHX9N0ixJj6Y+9+qoTzMzMzPr37y5hlWjJSIaASStC1wJDAG+l8pWAvYBngN2AGZExGOSrgPGA6dL2hsYEBFXSboYuC0iJqX7P9GJWO6OiD3TfY3A9ZJaIuKOdu6ZGBHnS/o4cHf6DB2Zm/vMRwOnAYd3dJOkDck+88iIWCRpMLBOFf2ZmZmZWT/mGS/rlIiYDxwFHCdJqXgMMBv4OTA2V/1MYL+UIJ0LHJvK1wf+kWvz0S7G0pz6OK7K+o8DbwMf7GRXawL/rLLuusBrwOLU5+KIeKaT/ZmZmZlZP+MZL+u0iPhbmuVaF3iJLNn6HfBH4GxJAyJiaUQskXQScBdwQUSUUhMXAdMkHQfcDlwaES90MZyHgap+8Y6k7YB3gAVVVB8uqRlYAxgIbFdlPDPJnskzku4ArouIG3PXz5N0epVtmVkvalnSQqlU6riiLcfPrHg8JsXi8SiWWo7HiBEj2r3uxMu6SgCSVgV2B06MiNck3QfsAkwHiIgbJf0L+FnrjRFxi6RNgN2ALwKPSNoiIqpJiCrG0YETJR1CNhN1QESEpKhQL1+WX2p4APDLFG+7ImKZpN2AbYHPAxMlbRMRTanKyRFx7bvB+x0vs8JoGNjQ4f80bXmlUsnPrGA8JsXi8SiWeo+Hlxpap6WkaRkwnywZGQLMkjQP2J7llxtCNsv0Tr4gIl6JiCsj4lDgAbJ3w7pia+DxDupMjIjGiPhsRNydyl4GPtBaQdLawMI27r+hM/FF5v6IOAc4EPhqtfeamZmZWf/kxMs6RdI6wC+ACyMiyJKsIyJiWEQMAzYGdpE0sJ02dmq9LmkNYDjwbBdi+QTwXbKli501AzggzdgBjAPubKPu9sDcKmPaQNLIXFEj8PcuxGdmZmZm/YiXGlo1GtL7TgPINqf4DXBBSp52BY5urRgRr0u6B/gSMK2N9rYBLpT0Nlnyf0lEPFBlLJ+V9AjZe1fzgeM72NGwooi4SdI2wEOSlpElVsfkqrS+4yXgLeCI3LXPS/pH7ny/3PEA4HxJGwBvkL1Plm/XzMzMzFZATrysQxGxchuXlgBrV6j/lbLzYWXn5wHnVdn3PGCLdDyDbFlj1XLvVlW6dgZwRht9NrzvhvdiqHRtx9zxTm3cO65C2eC24jMzMzOz/sNLDc3MzMzMzGrMM15WCJK2JFvCmPdmRFS1jbuk8Sy/5A/gmog4qyfiMzMzMzPrDideVggRMYtsI4qu3n8W0K+SrNHNU+odgpH9bqeGgRVXnlod1HI8hg8dVJN2zczMwImXWWFNn9RU7xCM+v/OD1uex8PMzPoqv+NlZmZmZmZWY068zMzMzMzMasxLDc0Kao8TmuodguF3vIqmfDyGDx3E5Akn1zEiMzOz6jjxMiuoexuPrHcIZsXnTWjMzKyP8FJDMzMzMzOzGnPiZWZmZmZmVmNOvMzMzMzMzGrMiVcvkjRM0ux6x9EWSVMlPSNppqSnJF0u6d/L6mwtKSTtms4l6R5JX8zV2V/Szel4vKTHJD0qqVnSdu30P0DSuZJKkmZLur+1XUnzJM1K7fxZ0ka5+5altlu/Tk3lMyQ9me55QtKFktbK3bdY0pa5+15Jn79Z0u099VzNzMzMzLy5Rh8haZWIeLsXujo5Iq6VJOC/gDslbRERb6XrY4F70p+3RERIOga4RtKdwMrAWcBukj4N7AmMjIg3JX0QWLWdvr8PrA9skeqvB3wud31MRCyUdAZwOtC6+0RLRDS20ebBEfGgpFWBc4A/5tuMiFlAI2SJJ3BTRFzb8WMyMzMzM6ueZ7x63yqSLkuzMNdKGphmcz4IIGmUpBnpuEnSLyXdClwuaWVJ50l6IN1/dKo3WNIdkh5Os0J7pfLlZtgknSSpqZogIzMReBFonXUSsC8wDthF0uqp7mzgRuAU4HvA5RExlyyJWhgRb6Z6CyPihUr9SRpIlkh9M1f/pYi4ukL1vwL/XqG8vc/zFvBt4MOSturMvWVx7phm3K5Os4LnSjo4zc7NkjQ81fuSpPskPSLp9pREImmypAnpeFdJd0ny30MzMzOzfs4zXr1vU+DrEXGvpF8D3+ig/jbA9hHRIukoYFFEbCtpNeDelJQ9B+wTEa+mBO7/JN3QQ/E+DHyMbKZoNPBMRMxNyeHuwHWp3hmp7lvAqFR2KzBB0lPA7cC0iPhzG/18BHg2Il6tIqbdgOtz5w2SmnPn50TEtPKbImKZpJnp88ysop+2bAV8HHgF+BtwSUR8UtIJwDfJZgrvAT6VZgSPIEv6/hs4FXhA0t3AZGD3iHinG7GYrdBalrRQKpXqHcYKzc+/eDwmxeLxKJZajseIESPave7Eq/c9FxH3puPfAsd3UP+GiGhJx7sAn5C0bzofAowA/gGcLWkH4B2y2aD1eihe5Y7HAlel46uAQ0mJV0S8LmkasDg3Y7VY0jbAZ4ExwDRJp0bE1C7GcmeaOZpPttSwVXtLDdv7PF31QET8PwBJc8kSTIBZZJ8TYEOyz7s+2fLKZwAiYomkI4G7gBPTzKCZdVHDwIYO/0dntVMqlfz8C8ZjUiwej2Kp93h4iVPviwrnb/PeWKxedv313LHIluI1pq+NI+JW4GBgHWCblIC8lNrJt1up7WpsDTwuaWXgq2QzWPOAnwJflLRGru476eu9DxexLCJmRMT3gONSG5U8TbYMcI02rkOW1GwEPAac2dkPkj7DlsDjnb23zJu543dy5+/w3j9m/BS4MCK2BI5m+We/JfAysEE34zAzMzOzPsKJV+/7cNp0At7bqGIe2ZJCaDsxAbgF+E9JAwAkfVTSILKZr/kRsVRSa3ICWQK2rqShaWnintUGqczxZO9p3QzsDMyMiA9FxLCI2Aj4PbB3O21sKin/zwqNwN8r1Y2IJcCvgMlpIwwkrS/pkLJ6LWRL+Q6TtHYnPs8Ass01nouIR6u9rxuGAM+n48NzcWxEtuRwa7LEtc1dHs3MzMys/3Di1fseBw6X9CiwNvBzsvejJqX3fpa1c+8lwBzg4bRpxsVkMyxXAKMkPUg2+/UEQEQsJZsZug+4qbW8A+el96CeArYl20nwLbIk8Q9ldX8PHNROW4OByyTNSZ93M6CpnfqnAwuAOenzXZ/Ol5OW+f0OODYVNWj57eTPzVW/IvU9GxgE7NVO/z2piWynx7uBhfDu5iS/Ak5Km4x8HbikdZMSMzMzM+u/FFG+8s3M6mXRokXv/oVc69Ln26tqZsDo5ilMn9RU7zBWWPV+X8Lez2NSLB6PYunN8RgyZMj79hXwjJeZmZmZmVmNeVfDFZCki8i2hs+bFBGX9lL/fwA2Lis+JSJu6Y3+qyFpS+A3ZcVvRoTfyTIzMzOzTnPitQKKiGM7rlXT/vepZ//ViIhZZJuB1M3o5in17N6SliUtNAxsqHcYlpSPx/Chg+oYjZmZWfWceJkVlN9bKQavzy8Wj4eZmfVVfsfLzMzMzMysxpx4mZmZmZmZ1ZiXGpoV1B4nNNU7BMPvePWm4UMHMXnCyfUOw8zMrCaceJkV1L2NR9Y7BLPe5Q1lzMysH/NSQzMzMzMzsxpz4mVmZmZmZlZjTrzMzMzMzMxqbIVNvCQNkzS73nG0R9IqkhZKOqesfIakZyUpV3a9pMWStpTUnL5ekfRMOr69nX4+KulPkp6W9LikqyWtJ2lHSYskPSLpCUnn5+4ZJ2lBrq9mSZul59qS7nlc0v2SDi+770JJ43P3LcsdH99GjJumz92c2v1lvr0Kz2dUOp4n6e6y681FH3szMzMz61+8uUYXSFolIt7uha52AZ4E9pd0WkRE7tq/gNHAPZLWAtYHiIhZQGOKcypwU0Rc21YHklYHpgPfiogbU9kYYJ1U5e6I2FNSA/CIpD/8//buPc7Kqt7j+OfrlQENFS/ldRRRE028lB4BL2moiampKd208tJJy+hoWmShhVlahmmalljmLe8knoN5OyJ5x1HE24iigB6viSijKfzOH8/a+LCb2bNn9t4ze2a+79drXuy9nvWs9XuexcD+zVrPmoiYno5dFRHHFbXXCMyOiG3T+02A6yQtFxGTCvUiYgIwIdV5OyKGtXMvzgHOjogb0zlbt1M/b1VJG0TEXEkf78B5ZmZmZmZV0WdnvJIVJP1J0qOSrpHUP82QrAkgaQdJd6bX4yVdKOkW4M+Slpd0pqQH0vnHpHqrSLpN0gxJMyXtn8qXmWGTdIKk8e3ENwaYCLwA7FR07ErgsPT688B1nbwHXwTuKSRdABFxR0QsMyMUES1AE7BeRxqPiGeB7wGtzmR1wMeAebl2Z3bg3L8Ch6bXY4ArSlVOs2g3SPpbmjE8TtL30izevZLWSPUGS/ofSQ9JmiZpi1S+n6T7Uv1bJa2TysdLujjNyD3b1uyemZmZmfU+fX3Ga3PgGxExXdLFwLfaqb89MCIiWiQdDSyIiE9KWhmYnpKyucCBEfFWSuDulTS5o4GlGaY9gGOA1cgShntyVW4DLpK0PFkCdjRwSkf7AbYCHiojntWBIcBdueJDJY3Ivf+PNk6fAWzRidjyzgZul/QP4BZgUkS8Wea51wCXAGcB+wFfAr7SzjlbAdsC/YBngJMiYltJZwNfBX4DXAh8MyKaJe0I/A74NHA3sFNEhKQjge8D/5Xa3QLYHVgVeErS+RHxfpnXYdartSxqobm5ud165dSxruPxqD8ek/ri8agvtRyPIUOGlDze1xOvubllc3+h/VmZyWnmB7JlgJ+QdHB6P5AsMZkHnC5pF2AJ2QzROp2IbTRwR0QsknQtcIqksRGxOB1fTPYB/1CgISLm6MNHvqpppKRHyZLUMyLi/3LHWltq2FobFQcWEZMkTQX2BvYHjpG0DRBtnZJ7/QbwT0mHAU8Ai8ro8o6IWAgslLQAKMwIziQb91WAnYGrc9e8cvpzfeAqSR8DVgKey7U7JSLeA96T9ArZ3415mBkN/Rva/U+rubm53TrWdTwe9cdjUl88HvWlu8ejrydexR/aA/iAD5dg9is6/k7utYBvR8TUfAVJR5A9H7V9RLwvaU5qJ99ua20XGwMMT+cDDCKbKclvknElcD0wvp22SpkF7FrieOEZr83Inie7PiKaOtjHtmQJT0Ui4kXgYuDitGxzK+B1YPWiqmsArxWVXQWcBxxRZnfv5V4vyb1fQvZ9sxzwZhvPpv0W+HVETJa0G8uOT77dxfh70MzMzKxP6OvPeG0oqbA8bgzZDNIcsiWFAAeVOHcq8J+SVoSlOwMOIJv5eiUlXbsDG6X6LwNrSxqUliaObqthSR8BRgAbRkRjRDQCx6YY86YBP6edZ5bacTmws6R9c/3vXbx5RUQ8nfo6qSONp802ziJLRjotxVS41x8lS0TnAw+QJagfTcd2IJt5mlvUxPXAL8nGrWIR8RbwnKRDUr9KM3CQ/R2Yn14f3tr5ZmZmZta39PWftj8BHC7p90AzcD5wP/BHST8E7itx7h+ARmCGsrVmrwIHAJcBf5P0INlmFE8CpETstNTmc4XyNnweuD0tSSu4EfhlStpIbQZZUtNp6Xm10cBvJP0GeB94FDieLLnJuwA4QdLG6X3xM17fAl4EBkt6mGxWbyHw2/yOhp00Cpgo6d30/sTCskdJxwM3S1oOeBsYExFLiq5zIfCLVL/CUJb6EnC+pB8BK5LNQD5CNsN1taT5wL3Axm22YGZmZmZ9gpbdodzMutOCBQuWfkOuNml+qapmvc7wpouYMnF8yTrdvT7fluXxqD8ek/ri8agvXTkeAwcO/Lef9Pf1pYZmZmZmZmY119eXGnY7SeeR/SLkvIlVWJpX3M/WwKVFxe9FxI7V7KdSksYBhxQVX51+4XK1+9qLtPww57mIOLDafZmZmZlZ3+bEq5tFxLFd1M9MoLUd+OpKSrCqnmS10ddUqrTZRi0Mb7qou0Mwst8t1dC/obvD6BMGDxrQ3SGYmZnVjBMvszrV3rMu1jW8Pt/MzMyqwc94mZmZmZmZ1ZgTLzMzMzMzsxrzUkOzOrXv8eO7OwTDz3h1lcGDBnDOj0/s7jDMzMxqxomXWZ2aPuyo7g7BrOt4MxkzM+vlvNTQzMzMzMysxpx4mZmZmZmZ1ZgTLzMzMzMzsxpz4mU1IWl9STdKapY0W9JESStJeljSsFRnBUnvSPpy7ryHJG0n6QhJSyR9InfsMUmNJfpcRdLvU3+zJN0lacfc8QMlhaQtcmWNklokNUl6XNKfJa1YxvVNlDRf0nJF5XtLul/Sk6nNqyRtmI5dIum5VN4k6R/l3U0zMzMz6+mceFnVSRJwHXBDRAwBNgNWASYA/wB2TlW3AZ4qvJc0ANgEeCQdnweM60DXfwDeAIZExFDgCGDN3PExwN3AYUXnzY6IYcDWwPrAF9q5vuWAA4G5wC658q2A3wKHR8QWqc3LgMbc6SdGxLD0tTNmZmZm1ic48bJa+DTwbkRMAoiIxcBY4OvAdD5MvHYGLgCGpfefAmak+gA3AUMlbd5eh5IGAzsCP4qIJanfZyNiSjq+CjAc+Ab/nniRi/N+YL12utsdeAw4nyyZKzgJOD0insi1OTki7movfjMzMzPr3bydvNXCUOChfEFEvNoIzMMAACAASURBVCXpBbKE5WepeGfgVGCMpFXT++m505YAvwR+CBxeRp9NuaSt2AHA/0TE05LekLRdRMzIV5DUjyx5O76dvsYAVwA3AqdLWjEi3k8xnNXOuWdK+lF6PSsivtROfbM+oWVRC83NzWXVLbeedQ2PR/3xmNQXj0d9qeV4DBkypORxJ15WCwKiRPlKkj4KbEG21PABsoRnZ7KlenmXA+MkbVxhTGOA36TXV6b3hcRrsKQmYAhwTUQ82lYjklYCPguMjYiFku4DRgFTiuoNAm4D+gMXRkQhITsxIq6p8FrMep2G/g3t/ocF2X+Y5dSzruHxqD8ek/ri8agv3T0eTrysFmYBB+ULJH0E2ACYDdwDHAy8FBEh6V6yZYCfAu7NnxcRH0j6Fdkyvvb63EbScoWlhrm+B5Etf9xKUgDLAyHp+6nK7IgYJuljwJ2SPhcRk9voZ29gIDAze5SN/sAissRrFrAd8EhEvA4Mk3QC2fNtZmZmZtaH+Rkvq4XbgP6SvgogaXngV8AlEbGIbDnhWLIEjPTnV4H/i4g3W2nvEmBPYK22OoyI2cCDwKlpcw8kDZG0P1mS9+eI2CgiGiNiA+A5YERRGy8BJwM/KHFtY4AjUzuNwMbAKEn9yZZFjpP08Vz9/iXaMjMzM7M+womXVV1EBNmuf4dIagaeBt4le1YLssRrE1LilRKe5cl2PGytvX8B5wBrt9P1kcBHgWckzQQuAl4kS5auL6p7LfDFVtq4gSxpHFl8ICVXe5FbVhgR75DtlLhfRMwkez7sz2k7+enAx8mWSxacmdtOviktXTQzMzOzXs5LDa0mImIusF8bxx4ge94rX9ZY9P4SspmuwvtzyJKvUn2+BRzVyqHdWqmbb2urXHmQbXPfWvuLgDVaKf987vUUip73yh07ovXIzczMzKy384yXmZmZmZlZjXnGy3qctJPgykXFX0lL/arVx17AL4qKn4uIA6vVh5mZmZn1HU68rMeJiB27oI+pwNRa91PK8KaLurN7S1oWtdDQv6G7w+j1Bg8a0N0hmJmZ1ZQTL7M6NWXi+O4Owej+3/lhZmZmvYOf8TIzMzMzM6sxJ15mZmZmZmY15qWGZnVq3+PHd3cIhp/xqrbBgwZwzo9P7O4wzMzMupwTL7M6NX1Ya7+SzKyH86YxZmbWR3mpoZmZmZmZWY058TIzMzMzM6sxJ15mZmZmZmY11m7iJalR0mNdEUxnSVpB0muSfl5UfqekFyQpV3aDpLclbS2pKX29Iem59PrWEv1sJulmSc9IekLSXyWtI2k3SQskPSzpSUln5c45QtKrub6aJG2Z7mtLOucJSfdLOrzovHMljcudtzj3+jttxDheUkjaNFc2NpXtkCvbNpXtlSvbIN2HNdL71dP7jUrck6GSbpf0tKRmSaco0yhpnqTliuo3SfpUinN+0X1Zrcx7+XDqa6qknYvGO3+NS//u5trN97dnW9dlZmZmZlZNNZ3xktRVm3eMAp4CvpBPspI3geEpntWAjwFExMyIGBYRw4DJwInpfasfxiX1A6YA50fEphHxceB8YK1UZVpEbAtsC4yWNDx3+lWFvtLX46l8dkRsm9o6DBgr6Wv5fiNiQi7Ollwb55S4HzNTewUHA48X1RkD3J3+LPQ1N13TGanoDODCiHi+jXvSQHbvzoiIzYBtgJ2Bb0XEHGAuMDJXfwtg1Yi4PxWdXXRf3kzl7d3LbSNiSIrvOkkfL3Ev8qYV9ddmkm1mZmZmVk3lJl4rSPqTpEclXSOpv6Q5ktYEkLSDpDvT6/GSLpR0C/BnSctLOlPSA+n8Y1K9VSTdJmmGpJmS9k/ly8ywSTpB0vh24hsDTAReAHYqOnYlHyYhnweuK/Oai30RuCci/lYoiIg7ImKZ2cCIaAGagPU60nhEPAt8D2h1JquDbgAK93MTYAHwauFgSk4PBo4ARqWksuBsYCdJ3wVGAL8q0c8XgekRcUu6hkXAccDJ6fgVLJsAHpbKytLevYyIO4ALgaPLbbMc6e/gk5L+IOkxSZdJ2lPS9DTT9qlUb4Cki9Pf7YeL/g5PS3+3ZxRm5dKs253pe+jJ1G7xDwrMzMzMrBcqd0Zqc+AbETFd0sXAt9qpvz0wIiJaJB0NLIiIT0paGZiekrK5wIER8VZK4O6VNLmjF5BmXfYAjgFWI0vC7slVuQ24SNLyZB/8jwZO6Wg/wFbAQ2XEszowBLgrV3yopBG59//RxukzgC06EVuxt4C5krYiS8CuAvIzacOB5yJidkqYP0tKSCPifUknAv8DjIqIf5XoZyhF9yS1uYqkjwB/BR6W9O2I+AA4FDgkV32spC+n1/+MiN3zbbVxL4vNIBv7coyU1JR7f1BEzG6j7qYp1qOBB8iSzBHA54AfAgcA44DbI+LraTb1fmVLVV8BPhMR70oaQpZsFpZAbkt2314EppONxd1lxm/W47UsaqG5ubmiNio936rL41F/PCb1xeNRX2o5HkOGDCl5vNzEa25ETE+v/0L7szKT02wFZMsAPyHp4PR+INmH6XnA6ZJ2AZaQzWqsU2Y8eaOBOyJikaRrgVMkjY2Ixen4YrIPtocCDRExp0aTDCMlPUqWpJ4REf+XO3ZVRByXr9xGDNUMrDDTtxdZYppPvMak44V6X2HZmcB9gJfIks2/l+hDQLRxLCLi/yTNAvaQ9DLwftEM4dkRcVYr55a6l63FsLTP1uLIvZ4WEaNLtJX3XETMBEjXcFtEhKSZQGOqMwr4nKQT0vt+wIZkSdW5koaR/f3bLNfu/RExL7XblNpy4mV9RkP/hnb/Yyqlubm5ovOtujwe9cdjUl88HvWlu8ej3MSr+ANtAB/w4VLFfkXH38m9FvDtiJiaryDpCLLno7ZPsyxzUjv5dltru9gYYHg6H2AQsDuQf37nSuB6YHw7bZUyC9i1xPFpETFa0mbA3ZKuj4imEvVbsy3wRKcjXNbfgDOBB9OsIgBp5u8gsoRhHNn4DJK0akQsTMnCZ8iWbN4t6cqIeKmNPmYBu+QL0tLGtyNiYSoqLDd8mfKXGXbkXubv2evA6rljawCvldlnsfdyr5fk3i/hw+8bkc2aPZU/MS2NfZnsmbflgHfbaHcx/iXmZmZmZn1Cuc94bSipsDyusCnDHLIlhZB9kG/LVOA/Ja0IS3cGHEA28/VKSrp2Bwo7570MrC1pUFqa2OYMRVrONgLYMCIaI6IROJbchhHJNODndOD5olZcDuwsad9c/3tL2jpfKSKeTn2d1JHGJTUCZwG/rSDGfBwtKYYJRYf2BB6JiA3SPdsIuBY4ID1vdD7w3Yh4gSxxa21GquAyYITS7oBp2ec5wC9zda4lW8p4KB/OspV7DSXvpaRdyZYCXpSK7gS+nHtu6nDgjo702UFTgW8X+pO0bSofCLwUEUvIZhOXr2EMZmZmZtYDlJt4PQEcnpZ/rUH24fxUYKKkaWQ/uW/LH8h21JuRNs34PdlP+S8DdpD0IPAl4EnInjECTgPuA24qlLfh82TP2ORnEW4km81ZuVAQmbMiorOzH4VEZjTZB+1mSY+TbU7xSivVLwB2kbRxen+olt3GvLAF+uC0KcMTZM9D/TYiJnU2xlZivjIiZhQVjyGb/cu7luwZpqOAFyKisLzwd8AWKcFprf0WsmfIfiTpKbLdFB8Azs3VeRO4F3g5Ip4ramJs0X1pbKWbtu7l02TPWh0UEYUZrwuBhcAjkh4BVmHZxHFkUX8HU5mfAisCj6a/2z9N5b8j+365l2yZ4TttnG9mZmZmfYQi2npEx8y62oIFC5Z+Q642aX53hmJWE8ObLmLKxPGdPr+71+fbsjwe9cdjUl88HvWlK8dj4MCB/7Z3Q01/j5eZmZmZmZn1oAf7JZ1H+kXIOROruTQv9bM1cGlR8XsRsWM1+6lU2hjjkKLiqyOi+JmuavTVI+5JR0kaRPbrBortERGvd3U8ZmZmZtZ79ZjEKyKO7aJ+ZgLDuqKvSqQEq+pJVht99Yh70lEpuarb6xredFH7lazmWha10NC/obvD6DUGDxrQ3SGYmZl1ix6TeJn1NZU8B2PV4/X5ZmZmVg1+xsvMzMzMzKzGnHiZmZmZmZnVmJcamtWpfY8f390hGH7GqxoGDxrAOT8+sbvDMDMz61ZOvMzq1PRhR3V3CGbV4Y1izMzMvNTQzMzMzMys1px4mZmZmZmZ1ZgTLzMzMzMzsxpz4tUHSFosqUnSLEmPSPqepOWK6kyUNL9QLmmopKclNeTqTJF0mKR1JN2U2npc0s0l+m6U1JL6f1zSnyWtmI7tJmlBOlb42jMdW0fS5ZKelfSQpHskHZg776ZcvWVikbR1rr03JD2XXt9aKp4S9+Jrufb+JWlmen2GpCMknZs792hJT6av+yWNyB27U9KDufc7SLqzE0NqZmZmZj2ME6++oSUihkXEUOAzwGeBnxQOpgTjQGAusAtARMwCrgPGpToHACtGxJXAacDfI2KbiNgSOLmd/mdHxDBga2B94Au5Y9NSbIWvWyUJuAG4KyI2iYjtgcPSucX+LZaImFloD5gMnJje79lePG3ci0m59l4Edk/vl7luSaOBY4AREbEF8E3gckkfzVVbW9I+7dwvMzMzM+tlnHj1MRHxCnA0cFxKcAB2Bx4DzgfG5KqfBhwiaRhwBnBsKv8YMC/X5qNl9r0YuB9Yr52qnwb+FREX5M59PiJ+20rdTsVSIp627kU5TiJL8l5L7c8A/sSH9w3gTOBHHWzXzMzMzHo4byffB0XEs2lmZ23gZbIE4wrgRuB0SStGxPsRsUjSCcBdwK8jojk1cR5wlaTjgFuBSRHxYnv9SuoH7AgcnyseKakp9/4gYCgwo8zL6VQsJeJp9V6UGctQ4KGisgeBw3Pv7wEOlLQ7sLDMds16tJZFLTQ3N7dfsUzVbMsq5/GoPx6T+uLxqC+1HI8hQ4aUPO7Eq+8SgKSVyJYejo2IhZLuA0YBUwAi4m+S3gR+VzgxIqZK2gTYG9gHeFjSVhHxaht9DU7J1RDgmqJZqWkRMXqZwJZOxC19fx4wgmwW7JP5Y52Ipc142rsXnSQgisp+RjbrdVIF7Zr1GA39G9r9z6hczc3NVWvLKufxqD8ek/ri8agv3T0eXmrYB6VEZTHwClnCMhCYKWkOWYJTvMRuSfpaKiLeiIjLI+IrwAOk56HaUHimalNgJ0mfayfEWcB2ub6OBfYA1mqtcgdjKRVPOfeilMeB7YvKtkvl+XhvB/oBO3WgbTMzMzPrwZx49TGS1gIuAM6NiCBLLI6MiMaIaAQ2BkZJ6l+ijU8XjktaFRgMvNBe3xHxEtlGHD9op+rtQD9J/5krazWezsbSRjwdvhdFfgn8QtKgFM8w4Ahys4U5E4Dvl9mumZmZmfVwTrz6hoa0/fkssuegbgFOTQnFXuSW0kXEO8DdwH4l2tseeFDSo2TPLP0hIh4oM5YbgP6SRqb3I4u2kz84JYQHALumreDvJ9ukorWleZXEko9nVzp3L5aKiMnAxcA/JD0JXAR8OSV4xXVvBkothzQzMzOzXkTZZ1wzqwcLFixY+g252qT53RmKWdUMb7qIKRPHV6Wt7l6fb8vyeNQfj0l98XjUl64cj4EDB6q4zDNeZmZmZmZmNeZdDa0qJG0NXFpU/F5E7Ngd8ZiZmZmZ1RMnXlYVETETGNbdcfQmw5su6u4QjOx3UDX0b+juMHq0wYMGdHcIZmZm3c6Jl1mdqtYzMVYZr883MzOzavAzXmZmZmZmZjXmxMvMzMzMzKzGvNTQrE7te/z47g7B8DNenTV40ADO+fGJ3R2GmZlZ3XDiZVanpg87qrtDMOs8bw5jZma2DC81NDMzMzMzqzEnXmZmZmZmZjXmxMvMzMzMzKzGnHhViaTFkpokzZL0iKTvSVquqM5ESfML5ZKGSnpaUkOuzhRJh0laR9JNqa3HJd1cou9GSY+1cWwFSa9J+nlR+WhJD+faP0bSuHQNTbnraZL0nTbaHp+up0nSY5I+lys/oajuHElrptfrS7pRUrOk2em+rJSO7SYpJO2XO/cmSbul13dKeioX2zVt3ZdU/6sptlnpOk9I5ZdIOrio7ttF78dKelfSwFxZe/GtIOn0dG2FGMfl6ubva5Okk0vFb2ZmZma9gxOv6mmJiGERMRT4DPBZ4CeFgynZOhCYC+wCEBGzgOuAcanOAcCKEXElcBrw94jYJiK2BDr7AX0U8BTwBUlK/awIXAjsFxHbANsCd0bEhHQNw3LXMywizinR/tmp/iHAxcXJZrEUw3XADRExBNgMWAWYkKs2j3RP2vClXGwHt1VJ0j7Ad4FRaVy2AxaUiq/IGOABsnHLKxXfz4B1ga3TfRkJrJg7nr+vwyLijA7EY2ZmZmY9lBOvGoiIV4CjgeMKyQ6wO/AYcD7ZB/qC04BDJA0DzgCOTeUfI/uAX2jz0U6GMwaYCLwA7JTKViXb0fL11PZ7EfFUJ9svxPcE8AGwZjtVPw28GxGT0nmLgbHA1yX1T3UeARZI+kwlMQE/AE6IiBdTX+9GRFlbrUkaTJYQ/ohlx6vN+FL8RwHfjoh3U58LI2J8RVdhZmZmZj2et5OvkYh4Ns3+rA28TPbh/QrgRuB0SStGxPsRsSgtf7sL+HVENKcmzgOuknQccCswqZBAlCstYdwDOAZYLcVwT0S8IWky8Lyk24CbgCsiYklnr1fSjsAS4NVUNFbSl3NV1k1/DgUeyp8bEW9JegHYNFf8s/T191a6u0xSS3r994ho65cFbVXcV5EzJf2ojWOF8ZoGbC5p7ZRQl4pvU+CFiFhYos8GSU259z+PiKtK1DfrkVoWtdDc3Nx+xU6oVbvWOR6P+uMxqS8ej/pSy/EYMmRIyeNOvGqrsLRvJbKlh2MjYqGk+8iWAE4BiIi/SXoT+F3hxIiYKmkTYG9gH+BhSVtFxKvFnZQwGrgjJXfXAqdIGhsRiyPiSElbA3sCJ5AtjzyiE9dYSLAWAodGRKRJvrMj4qylN0KaU3gJRCvtLFMeEdMkIWlkK3W/FBEPdiLWYidGxNJnxIqe8ToMODAilki6jmwp5Xllxldo72vA8cAgYOeImEtaaliF2M3qWkP/hnb/A+qM5ubmmrRrnePxqD8ek/ri8agv3T0eXmpYIylpWgy8QpY8DQRmpgRkBP++fG1J+loqIt6IiMsj4itkzxrt0sEwxgB7pj4fIksAds+1PzMiziZLug7qYNsFZ6dnlUZGxLQy6s8CdsgXSPoIsAEwu6juBEo/61VOX9t39CRJnwCGAH9P9+4w/n28WovvGWBDSasCRMSklGQtAJbvaBxmZmZm1ns48aoBSWsBFwDnRkSQfWg/MiIaI6IR2BgYlXumqbU2Pl04nj7IDyZ7TqvcGD5CluBtmOv3WGCMpFUKu/Alw4DnO3CJlbgN6C/pqynO5YFfAZdExKJ8xYi4BVgd2KaTff0c+KWkj6a+Vm5rh8YiY4DxhfsWEesC60naqFR8Kf4/AudK6pe7vpU6Gb+ZmZmZ9RJOvKqnIW0PPovsmaxbgFNT8rQXaVkhQES8A9wN7NdqS5ntgQclPQrcA/whIh4oUX9zSfMKX2TPdd0eEe/l6twIfI5s9uX7hW3ZgVPp3DLDDkuJ6IFkG4o0A08D7wI/bOOUCcD6RWWX5bZjv7VEXzeTLQ+8NY3LQ5S3vPYw4PqisutTeXvxjQNeAh6T9DDZM2J/AgrP5zVo2e3kvauhmZmZWR+g7HOwmdWDBQsWLP2GXG3S/O4Mxawiw5suYsrE8VVvt7vX59uyPB71x2NSXzwe9aUrx2PgwIEqLvOMl5mZmZmZWY15V8MeJO1CeGlR8XsRsWON+x1Htqtf3tURMaG1+l2t3uMzMzMzM3Pi1YNExEyyjTC6ut8JZM8y1aV6j6+zhjeV9buercZaFrXQ0L+hu8PocQYPGtDdIZiZmdUVJ15mdaoWz8dYx3l9vpmZmVWDn/EyMzMzMzOrMSdeZmZmZmZmNebEy8zMzMzMrMaceJmZmZmZmdWYEy8zMzMzM7Mac+JlZmZmZmZWY068zMzMzMzMasyJl5mZmZmZWY058TIzMzMzM6sxJ15mZmZmZmY15sTLzMzMzMysxpx4mZmZmZmZ1ZgiortjMLNkwYIF/oY0MzMz6+EGDhyo4jLPeJmZmZmZmdWYEy8zMzMzM7Ma81JDMzMzMzOzGvOMl5mZmZmZWY058TLrQpL2lvSUpGckndzK8ZUlXZWO3yepMXfsB6n8KUl7dWXcvVVnx0PSIEl3SHpb0rldHXdvVcF4fEbSQ5Jmpj8/3dWx90YVjMenJDWlr0ckHdjVsfdGlfz/kY5vmP7NOqGrYu7NKvj+aJTUkvseuaCrY++NKvx89QlJ90ialf4f6VerOJ14mXURScsD5wH7AFsCYyRtWVTtG8A/I2JT4GzgF+ncLYHDgKHA3sDvUnvWSZWMB/AucArgDzBVUuF4vAbsFxFbA4cDl3ZN1L1XhePxGLBDRAwj+/fq95JW6JrIe6cKx6PgbOC/ax1rX1CF8ZgdEcPS1ze7JOherMLPVysAfwG+GRFDgd2A92sVqxMvs67zKeCZiHg2Iv4FXAnsX1Rnf+BP6fU1wB6SlMqvjIj3IuI54JnUnnVep8cjIt6JiLvJEjCrjkrG4+GIeDGVzwL6SVq5S6LuvSoZj0UR8UEq7wf4YfLKVfL/B5IOAJ4l+/6wylU0HlZ1lYzHKODRiHgEICJej4jFtQrUiZdZ11kPmJt7Py+VtVonfXBZAAwq81zrmErGw6qvWuNxEPBwRLxXozj7iorGQ9KOkmYBM8l+kvwBVolOj4ekAcBJwKldEGdfUem/VxtLeljS/0oaWetg+4BKxmMzICRNlTRD0vdrGain/s26Tms/6Sr+SXBbdco51zqmkvGw6qt4PCQNJVs+MqqKcfVVFY1HRNwHDJX0ceBPkv47IjxD3HmVjMepwNkR8bYnXKqmkvF4CdgwIl6XtD1wg6ShEfFWtYPsQyoZjxWAEcAngUXAbZIeiojbqhtixjNeZl1nHrBB7v36wItt1UnrjgcCb5R5rnVMJeNh1VfReEhaH7ge+GpEzK55tL1fVb4/IuIJ4B1gq5pF2jdUMh47Ar+UNAf4LvBDScfVOuBertPjkR4ZeB0gIh4CZpPNuljnVfr56n8j4rWIWATcDGxXq0CdeJl1nQeAIZI2lrQS2WYZk4vqTCbbHADgYOD2yH7Z3mTgsLQrz8bAEOD+Loq7t6pkPKz6Oj0eklYDpgA/iIjpXRZx71bJeGxc2ExD0kbA5sCcrgm71+r0eETEyIhojIhG4DfA6RHh3VgrU8n3x1qFzbEkbUL2//mzXRR3b1XJ/+dTgU9I6p/+3doVeLxWgXqpoVkXiYgP0k8ZpwLLAxdHxCxJpwEPRsRk4I/ApZKeIftJzGHp3FmS/kr2j8EHwLG1fPizL6hkPADST48/AqyUHlwfFRE1+8e6t6twPI4DNgVOkXRKKhsVEa907VX0HhWOxwjgZEnvA0uAb0XEa11/Fb1Hpf9eWXVVOB67AKdJ+gBYTPYMpFdSVKDCz1f/lPRrsuQtgJsjYkqtYpV/eGtmZmZmZlZbXmpoZmZmZmZWY068zMzMzMzMasyJl5mZmZmZWY058TIzMzMzM6sxJ15mZmZmZmY15sTLzMysj5I0XtJf0usNJb1d+B1DVexjjqQ9q9mmmVlP5MTLzMysRlLS8bKkAbmyIyXd2Y1htSoiXoiIVbrydwRKukTSz7qqv1LySaiZWS048TIzM6utFYDjK21EGf+/XQOSVujuGMys9/M/4GZmZrV1JnCCpNVaOyhpZ0kPSFqQ/tw5d+xOSRMkTQcWAZuksp9J+kdaGvg3SYMkXSbprdRGY66NiZLmpmMPSRrZRhyNkkLSCpL+I7Vd+HpX0pxUbzlJJ0uaLel1SX+VtEauna9Iej4dG1fuTcr1/7UU7z8lfVPSJyU9KulNSefm6h8habqk36Z796SkPXLH15U0WdIbkp6RdFTu2HhJ10j6i6S3gG8CPwQOTdf7SKr3NUlPSFoo6VlJx+Ta2E3SPEn/JekVSS9J+lrueIOkX6V7sUDS3ZIa0rGd0vi9KekRSbuVe5/MrOdy4mVmZlZbDwJ3AicUH0gJyxTgHGAQ8GtgiqRBuWpfAY4GVgWeT2WHpfL1gMHAPcAkYA3gCeAnufMfAIalY5cDV0vqVyrgiLgnLTtcBVgduBe4Ih3+DnAAsCuwLvBP4Lx0PVsC56fY1k3XtH6pvlqxIzAEOBT4DTAO2BMYCnxB0q5FdZ8F1kzXfF0uCbwCmJfiOBg4PZ+YAfsD1wCrAX8ETgeuSte9TarzCjAa+AjwNeBsSdvl2vgoMJBsHL4BnCdp9XTsLGB7YGeye/99YImk9cjG/Gep/ATgWklrdfA+mVkP48TLzMys9n4MfLuVD9f7As0RcWlEfBARVwBPAvvl6lwSEbPS8fdT2aSImB0RC4D/BmZHxK0R8QFwNbBt4eSI+EtEvJ7O/xWwMrB5B2I/B3iHLAECOAYYFxHzIuI9YDxwcFqudzBwU0TclY6dAizpQF8AP42IdyPiltTvFRHxSkTMB6blr40sMfpNRLwfEVcBTwH7StoAGAGclNpqAv5AlhAW3BMRN0TEkohoaS2QiJiS7nNExP8CtwD5GcP3gdNS/zcDbwObpyWhXweOj4j5EbE4Iv6R7smXgZsj4ubU99/JkvPPdvA+mVkP48TLzMysxiLiMeAm4OSiQ+vy4SxWwfNkMygFc1tp8uXc65ZW3q9SeJOWwj2Rlru9STZDs2Y5caeldbsBX4yIQgK1EXB9Wib3JtkM22JgnXQ9S+ONiHeA18vpqzPXBsyPiMi9fz7FsC7wRkQsLDrW3n1dhqR9JN2bliu+SZYc5e/d6ynZLViU4lsT6AfMbqXZjYBDCvcvtTsC+Fh78ZhZz+bEy8zMrGv8BDiKZT/8v0j2AfqxBAAAAjVJREFUQTxvQ2B+7n3QSel5rpOALwCrR8RqwAJAZZ77U2D/NLNWMBfYJyJWy331SzNSLwEb5NroT7bcsFbWk5S/lg3J7umLwBqSVi06Vuq+LvNe0srAtWRLBtdJ9+5myrh3wGvAu2TLQIvNBS4tun8DIuKMMto1sx7MiZeZmVkXiIhngKvInpEquBnYTNIX06YWhwJbks2OVcOqwAfAq8AKkn5M9rxSSWmp3lXAVyPi6aLDFwATJG2U6q4laf907BpgtKQRklYCTqO2nzXWBr4jaUVJhwAfJ1vGNxf4B/BzSf0kfYLsGazLSrT1MtCoD3eOXIlsWearwAeS9gFGlRNUmh28GPh12uRj+bRhycrAX4D9JO2VyvuljTo6+iycmfUwTrzMzMy6zmnA0t/pFRGvk23e8F9kS/K+D4yOiNeq1N9UsmfAniZbavcuZSyxA/Yg2zjimtzOhrPSsYnAZOAWSQvJNt7YMV3PLOBYsk08XiLbeGNela6lNfeRbcTxGjABODjdU4AxQCPZ7Nf1wE/S81RtuTr9+bqkGWmZ4neAv5JdxxfJrrtcJwAzyTY3eQP4BbBcSgr3J9tF8VWy8TgRfyYz6/W07NJoMzMzs/on6QjgyIgY0d2xmJmVwz9dMTMzMzMzqzEnXmZmZmZmZjXmpYZmZmZmZmY15hkvMzMzMzOzGnPiZWZmZmZmVmNOvMzMzMzMzGrMiZeZmZmZmVmNOfEyMzMzMzOrMSdeZmZmZmZmNfb/fjsKknW3B7cAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x17702236940>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fi_corrs_sorted = plot_feature_importances(fi_corrs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [],
   "source": [
    "submission_corrs.to_csv('test_two.csv', index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在比赛中，测试二的分数为0.753"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 结果\n",
    "在完成了所有的工作之后，我们可以说，额外添加的信息确实提高了性能！该模型显然没有优化我们的数据，但相比于原来的数据集，仍然有明显的改善。让我们正式总结一下表现：\n",
    "\n",
    "Experiment\tTrain AUC\tValidation AUC\tTest AUC\n",
    "Control\t0.815\t0.760\t0.745\n",
    "Test One\t0.837\t0.767\t0.759\n",
    "Test Two\t0.826\t0.765\t0.753\n",
    "\n",
    "我们所有的辛勤工作转化为了一个小改进——0.014。去除高度共线性的变量会稍微降低性能，所以我们要考虑不同的特征选择方法。此外，我们可以说，我们所构建的很多特征包含于模型所判断的最重要的100个特征中\n",
    "\n",
    "在这样的比赛中，即使是这种程度的微小提高也足以让我们上升100多位。通过在本文中进行许多小的改进，我们可以逐步实现更好的性能。我鼓励其他人利用这里的结果来改进自己的代码，我将继续记录我帮助他人的步骤"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 下一步\n",
    "下一步，我们会将本文中开发的代码应用到其他数据集上。在我们的模型中还有4个其他的数据文件！在下一章中，我们将把这些其他数据文件（其中包含有关以前在家庭信贷贷款的信息）中的信息合并到我们的训练数据中。然后，我们可以建立相同的模型，并运行更多的实验来确定我们的特征工程的效果。在这场比赛中还有很多工作要做，还有更多的成绩要做！我们会在下一章中再见"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
